在整个 Ember.js 文档中,您会发现在很多地方都提到了动态段的概念。这是什么意思?
1 回答
由于评论中的问题而编辑:
在 Ember 中,将Router
机制视为状态机:每个Route
都可以视为一个状态。有时,一个状态可以有它自己的小状态机。话虽如此:Aresource
是一个状态,你有可能的子状态。APersonRoute
可以定义为回调中的a resource
our a ;这真的取决于你的最终目标。例如,如果我们考虑基于人员模型的人员列表的资源,我们可能会有列出所有记录的路线。route
<Application>.Router.map
App.Router.map(function() {
this.resource('people');
});
通过这张地图,我告诉我的应用程序它需要一个人员模板(可能还有一个视图)、一个人员控制器和一条人员路线。还假定资源具有索引路由,这是隐含的,您不必对其进行编码,但如果需要,PeopleIndexRoute
按照约定,它会在资源本身的名称之后。
现在我可以(a)person
在资源下创建一条路线people
作为人员记录的单一状态;person
或 (b) 我可以在资源下创建people
资源,因此我将在person
资源下有更多选项(编辑、详细信息、删除);或 (c) 我可以为 person 创建一个单独的资源,如果我愿意,可以使用路径覆盖 url。
我有时会选择选项c:
App.Router.map(function() {
this.resource('people');
this.resource('person', {path: 'person/:person_id'}, function() {
this.route('edit');
this.route('delete');
});
});
这是有道理的,edit
因为它没有子状态,只有兄弟姐妹(删除)和父母(人)。记录的 url 是这样的:) ~/#/person/3/edit
。
路由,当没有定义为资源时,不会有任何子路由/状态,所以你没有 person.edit.index 就像你有 person.index 一样,换句话说,路由没有子,只有兄弟姐妹和资源可以同时拥有。
目前,路由指南是我们拥有的最可靠的文档。我强烈推荐它。
动态段是路由 URL 的一部分,它根据使用的资源而变化。考虑以下:
App.Router.map(function() {
this.resource('products', function() {
this.route('product', { path: ':product_id' })
}
});
在上面的存根中,行:
this.resource('products', function() {
将产生网址
~/#/产品
以下行将产生
~/#/products/:product_id
替换动态部分,你可以有一个这样的网址
~/#/products/3
这:product_id
就是使这条路线充满活力的原因。路由器会将资源(例如Product
模型)的 id 序列化为 URL,并将该 id 用于find
您的DS.Store
. 您经常会在如下路线中看到这一点:
App.ProductRoute = Em.Route.extend({
model: function(params) {
return App.Product.find(params.product_id);
}
});
因此,对于本示例,如果您访问~/#/products/3
,应用程序将尝试从您的商店加载 Product 模型的实例或尝试从您的后端 API 获取。
我还推荐Tom Dale 的这个截屏视频,他用 Ember.js 构建了一个博客阅读器应用程序,使用路由器和 ember-data API 根据 URL 的动态部分加载博客记录。