3

在整个 Ember.js 文档中,您会发现在很多地方都提到了动态段的概念。这是什么意思?

4

1 回答 1

5

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

由于评论中的问题而编辑:

在 Ember 中,将Router机制视为状态机:每个Route都可以视为一个状态。有时,一个状态可以有它自己的小状态机。话虽如此:Aresource是一个状态,你有可能的子状态。APersonRoute可以定义为回调中的a resourceour 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 的动态部分加载博客记录。

于 2013-03-29T16:22:55.177 回答