Javascript Ember.js路由器/控制器属性

Javascript Ember.js路由器/控制器属性,javascript,ember.js,ember-router,Javascript,Ember.js,Ember Router,我试图将我的头绕在控制器的模型属性或路径与内容属性之间。如果在管线中设置模型属性,是否会自动将其设置为生成的控制器中的内容属性 另外,我认为控制器的content属性允许您访问模板中该对象的属性,是这样吗 我阅读了文档,但仍然无法理解其中的一些约定。正如所回答的,Ember.Route有一个model功能,允许您将一个对象或一组对象设置为该路由的模型。处理单个对象的路由应具有扩展Ember.ObjectController的控制器,而处理对象集合的路由应具有扩展Ember.ArrayContro

我试图将我的头绕在控制器的
模型
属性或路径与
内容
属性之间。如果在管线中设置
模型
属性,是否会自动将其设置为生成的控制器中的
内容
属性

另外,我认为控制器的
content
属性允许您访问模板中该对象的属性,是这样吗

我阅读了文档,但仍然无法理解其中的一些约定。

正如所回答的,
Ember.Route
有一个
model
功能,允许您将一个对象或一组对象设置为该路由的模型。处理单个对象的路由应具有扩展
Ember.ObjectController
的控制器,而处理对象集合的路由应具有扩展
Ember.ArrayController
的控制器。 随后,在
路由
工作流中,来自
模型
钩子的数据通过
设置控制器
钩子设置到控制器的
内容
属性中

路由有自己的工作流来设置其控制器,因此默认情况下将调用此方法并使用模型填充内容。考虑以下事项:

框架应为这些路由生成默认代码,以便设置控制器,如下所示(如果需要,您可以覆盖):

在某些情况下(请参见上面链接的问题/答案),您可能需要/希望覆盖这些方法以执行与默认功能不同的操作,例如:

现在,模板将能够访问控制器中的数据。下面的示例迭代了
EmailsController
中的对象集合(
App.Email
)。此处可以访问此集合或其子对象中的任何公共属性,例如
{{email.address}

<script type="text/x-handlebars" data-template-name="emails">
    <ul>
    {{#each email in controller}}
        <li>
            {{#linkTo emails.email email}}
                {{email.address}}
            {{/linkTo}}
        </li>    
    {{/each}}
    </ul>
    {{outlet}}
</script>

    {{#控制器中的每封电子邮件}
  • {{{#链接到email.email-email} {{email.address} {{/linkTo}
  • {{/每个}}
{{outlet}}
请注意,模板不是直接与模型对话,而是与分配了模型数据的
内容
。正如我所说,您可以通过路由将任何对象隐藏在内容或模型中,因此您不必使用
DS.model
,也不必使用强耦合的体系结构


如果这个模型,而不是
App.Email
type,有不同的类型和不同的属性,它也可以在这里访问,但有一些限制。如果模型的属性是集合,则无法通过索引访问它(例如,
{{email.messages[0].body}}
将无法工作)。在这种情况下,最好的做法是控制器中的计算属性,它将允许您直接访问电子邮件消息集合的第一项(如果有的话)。

您是否看过介绍如何使用路由/视图/控制器/模型的介绍屏幕?我在一个月前做了一个,36分钟就完成了基础知识的讲解,我还没看过那个。我看了这部电影(),它真的帮助我理解了事物的整体结构。我来看看这个。谢谢这是我见过的最好的答案!非常感谢您花时间解释。您的答案比指南解释得更好
App.EmailsRoute = Ember.Route.extend({
    ...
    setupController: function(controller, model) {
        controller.set('content', model);
    }
    ...
});
App.EmailsRoute = Ember.Route.extend({
    model: function(params) {
        return [{id: 1, address: 'other@email.com'}];
    },
    setupController: function(controller, model) {
        // here, controller is whatever controller this route needs
        // by conventions, it knows it should be EmailsController
        // of the type ArrayController
        // model is whatever was returned by the model function above

        // the content is a "bag" which can be filled with a model or any
        // other object you need. Just keep in mind your view layer will
        // be referring to this object later on
        controller.set('content', model);

        // you can set other properties of the controller here too
        controller.set('applyFilter', true);
    }
});
<script type="text/x-handlebars" data-template-name="emails">
    <ul>
    {{#each email in controller}}
        <li>
            {{#linkTo emails.email email}}
                {{email.address}}
            {{/linkTo}}
        </li>    
    {{/each}}
    </ul>
    {{outlet}}
</script>