我试图围绕model
属性或路由与content
控制器的属性进行比较。如果您model
在路由中设置属性,这是否会自动将其设置为content
生成的控制器中的属性。
另外,我认为content
控制器的属性允许您访问模板中该对象的属性,这是真的吗?
我阅读了文档,但仍然无法消化其中的一些约定。
我试图围绕model
属性或路由与content
控制器的属性进行比较。如果您model
在路由中设置属性,这是否会自动将其设置为content
生成的控制器中的属性。
另外,我认为content
控制器的属性允许您访问模板中该对象的属性,这是真的吗?
我阅读了文档,但仍然无法消化其中的一些约定。
正如这里回答的那样,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}}
不能工作)。在这种情况下,最好的做法是控制器中的计算属性,它可以让您直接访问电子邮件消息集合的第一项(如果有的话)。