我试图环绕model
财产或与控制器的content
财产的路线我的头。如果您在路由中设置model
属性,是否会自动将其设置为生成的控制器中的content
属性?Ember.js路由器/控制器属性
另外,我觉得控制器的content
属性允许您访问的模板对象的属性,是真的吗?
我阅读文档,仍然我有麻烦消化一些约定。
我试图环绕model
财产或与控制器的content
财产的路线我的头。如果您在路由中设置model
属性,是否会自动将其设置为生成的控制器中的content
属性?Ember.js路由器/控制器属性
另外,我觉得控制器的content
属性允许您访问的模板对象的属性,是真的吗?
我阅读文档,仍然我有麻烦消化一些约定。
如答复here,Ember.Route
有一个model
函数,它允许您设置一个对象或一组对象作为该路线的模型。处理单个对象的路由应该有一个控制器,该控制器可以扩展Ember.ObjectController
,而处理对象集合的路由应该有一个控制器,该控制器可以扩展为Ember.ArrayController
。 随后,在Route
工作流,从model
钩来的数据经由setupController
钩设置到控制器的content
属性。
的航线都有自己的工作流程,建立自己的控制器,因此默认情况下此方法将被调用,并使用该模型的内容。考虑以下几点:
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: '[email protected]'}];
},
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);
}
});
现在模板将能够访问控制器的数据。下面的示例遍历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>
注意,模板不直接对话的模式,而是在content
,这与数据分配来自模型。就像我所说的,你可以通过路由存储内容或模型中的任何对象,所以你不会束缚于使用DS.Model
,也没有强烈的耦合架构。
如果这种模式,而不是App.Email
类型,有不同的类型有不同的属性,它也可以访问这里,有限制寿。如果模型的属性是集合,则无法通过索引访问它(例如{{email.messages[0].body}}
不起作用)。在这种情况下,最好的行动方案是控制器中的一个计算属性,它可以让您直接访问电子邮件的第一个消息收集项(如果有的话)。
这是我见过的最好的答案!非常感谢花时间来解释。 – brandonhilkert 2013-04-09 15:08:45
你的答案解释得比指南好得多 – ahnbizcad 2015-03-27 08:33:39
您是否看过任何介绍截屏视频,展示如何使用路线/视图/控制器/模型?我在一个月前做了一个,在36分钟内涵盖了基础知识http://toranbillups.com/blog/archive/2013/03/02/emberjs-rc1-introduction-screencast/ – 2013-04-09 13:43:52
我还没有见过这样的一个。我看过这个(http://www.youtube.com/watch?v=7O9X5oeAJm4),它真的帮助我了解事物的整体结构。我会检查这一个。谢谢! – brandonhilkert 2013-04-09 14:05:09