Ember.js中的"动态片段"?

Abd*_*ull 3 ember.js ember-router

在整个Ember.js文档中,我们可以找到在几个地方提到的动态段的概念.这是什么意思?

Mil*_*Joe 5

使用适当的样本进行更新:演示 | 资源

由于评论中的问题而进行修改:

在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)personpeople资源下创建一条路线作为人员记录的单一状态; 或者(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的动态部分加载博客记录.

  • 对于任何好奇的人:`App.Router.map(..)`来自[`Ember.Router.map(..)`](https://github.com/emberjs/ember.js/blob/master/packages /ember-routing/lib/system/router.js#L235)....`this.resource(..)`来自[`Ember.RouterDSL.resource(..)`](https://github.com/emberjs/ember.js/blob/v1.0.0-rc. 2 /包/余烬路由/ LIB /系统/ dsl.js#L12)....`this.route(..)`来自[`ember.RouterDSL.route(..)`](https://github.com/emberjs/ember.js/blob/v1.0.0-rc. 2 /包/余烬路由/ LIB /系统/ dsl.js#L42). (2认同)