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>