Ember.js中的“动态片段”?

时间:2013-03-29 14:47:46

标签: ember.js ember-router

在整个Ember.js文档中,人们发现动态细分的概念提到了at several places。这是什么意思?

1 个答案:

答案 0 :(得分:5)

使用适当的样本进行更新:Demo | Source

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

在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的动态部分加载博客记录。