由于评论中的问题而进行修改:
在Ember中,将Router机制视为状态机:每个机器都Route可以看作是一个状态.有时候,一个州可以拥有它自己的小型国家机器.话虽如此:A resource是一个你可能有孩子状态的州.一个PersonRoute可以被定义为作为resource我们一个route在<Application>.Router.map回调; 这真的取决于你的最终目标.例如,如果我们根据人员模型考虑人员列表的资源,我们可能会有一个列出所有记录的路径.
App.Router.map(function() {
this.resource('people');
});
Run Code Online (Sandbox Code Playgroud)
有了这张地图,我告诉我的应用它需要一个人员模板(可能是一个视图),一个人控制器和一个人路线.资源也被假定为具有索引路由,这是隐含的,您不必对其进行编码,但是如果需要,它将按照PeopleIndexRoute惯例在资源本身的名称之后.
现在我可以(a)person在people资源下创建一条路线作为人员记录的单一状态; 或者(b)我可以在person资源下创建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');
});
});
Run Code Online (Sandbox Code Playgroud)
这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' })
}
});
Run Code Online (Sandbox Code Playgroud)
在上面的存根中,行:
this.resource('products', function() {
Run Code Online (Sandbox Code Playgroud)
会产生网址
〜/#/产品
以下行将产生
〜/#/产品/:PRODUCT_ID
替换动态部分,你可以有这样的网址
〜/#/产品/ 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);
}
});
Run Code Online (Sandbox Code Playgroud)
因此,对于此示例,如果您访问~/#/products/3,则应用程序将尝试从您的商店加载产品型号的实例,或尝试从后端API获取.
我还推荐Tom Dale的这个截屏视频,他用Ember.js使用路由器和ember-data API构建一个博客阅读器应用程序,根据URL的动态部分加载博客记录.
| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |