2

我试图围绕model属性或路由与content控制器的属性进行比较。如果您model在路由中设置属性,这是否会自动将其设置为content生成的控制器中的属性。

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

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

4

1 回答 1

7

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

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

小提琴

App.Email = DS.Model.extend({
    address: DS.attr('string'),
    isActive: DS.attr('boolean')
});

App.Router.map(function() {
    this.resource('emails', function() {
        this.route('email', {path: ':email_id'});
    });
});

App.EmailsRoute = Ember.Route.extend({
    model: function() {
        return App.Email.find();
    }
});
App.EmailRoute = Ember.Route.extend({
    model: function(params) {
        return App.Email.find(params.email_id);
    }
});

App.EmailsController = Ember.ArrayController.extend();
App.EmailController = Ember.ObjectController.extend();

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

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);
    }
});

现在模板将能够访问控制器中的数据。下面的示例遍历App.Email. EmailsController此集合或其子对象中的任何公共属性都可以在此处访问,一个示例是{{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>

请注意,模板不是直接与模型对话,而是与content分配有来自模型的数据的模型对话。就像我说的那样,您可以通过路由将任何对象存储在内容或模型中,因此您不会被使用束缚,DS.Model架构也不会强耦合。

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

于 2013-04-09T14:40:48.107 回答