在整个Ember.js文档中,人们发现动态细分的概念提到了at several places。这是什么意思?
答案 0 :(得分:5)
由于评论中的问题而进行修改:
在Ember中,将Router
机制视为状态机:每个Route
都可以看作是一个状态。有时候,一个州可以拥有它自己的小型国家机器。话虽如此:resource
是一个你可能有孩子状态的州。可以将PersonRoute
定义为resource
我们route
回调中的<Application>.Router.map
;这真的取决于你的最终目标。例如,如果我们根据人员模型考虑人员列表的资源,我们可能会有一个列出所有记录的路径。
App.Router.map(function() {
this.resource('people');
});
通过这张地图,我告诉我的应用,它需要一个人员模板(可能是一个视图),一个人物控制器和一条人物路线。资源也被假定为具有索引路由,暗示并且您不必对其进行编码,但是如果需要,则按照约定,在资源本身的名称之后,它将是PeopleIndexRoute
。
现在我可以(a)在person
资源下创建一个people
路由,作为个人记录的单一状态;或者(b)我可以在person
资源下创建people
资源,因此我会在person
资源下有更多选项(编辑,详细,删除);或者(c)我可以为人创建一个单独的资源,如果我愿意,可以使用路径覆盖网址。
我有时会选择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,换句话说,路由没有孩子,只有兄弟姐妹和资源可以同时拥有。
目前,Routing Guide是我们对此最有力的文档。我强烈推荐它。
动态细分是路径网址的一部分,根据使用的资源进行更改。请考虑以下事项:
App.Router.map(function() {
this.resource('products', function() {
this.route('product', { path: ':product_id' })
}
});
在上面的存根中,行:
this.resource('products', function() {
将生成网址
〜/#/产品
并且以下行将生成
〜/#/ products /:product_id
替换动态部分,你可以有这样的网址
〜/#/产品/ 3
:product_id
是使这条路线充满活力的原因。路由器会将资源的ID(例如Product
模型)序列化到URL,并且还会将该ID用于find
DS.Store
中的模型。您经常会在以下路线中看到这一点:
App.ProductRoute = Em.Route.extend({
model: function(params) {
return App.Product.find(params.product_id);
}
});
因此,对于此示例,如果您访问~/#/products/3
,则应用会尝试从您的商店加载产品型号的实例,或尝试从后端API获取。
你可以看到一个说明here |的小提琴source here
我还推荐这个screencast by Tom Dale,他用Ember.js使用路由器和ember-data API构建一个博客阅读器应用程序,根据URL的动态部分加载博客记录。