在我的 Ember 应用程序中,我想有一个控制器来包装一组模型,我可以将其注入到其他控制器中。
我像这样设置它:
app/controllers/zones.js
:
export default Ember.Controller.extend({
model: function () {
return this.store.find('zone');
}
});
app/controllers/zones/index.js
:
export default Ember.Controller.extend({
needs: ['zones'],
zones: Ember.computed.alias('controllers.zones.model')
});
这似乎应该有效,但不幸的是,它没有。我在 JavaScript 控制台(在浏览器中)收到此错误:
Error: Assertion Failed: The value that #each loops over must be an Array. You passed function () {
"use strict";
return this.store.find('zone');
}
我尝试过移动东西,或者使用ArrayController而不仅仅是Controller,但我仍然收到此错误。
这对我来说意义不大,有什么想法吗?
事情是这样的,模型是需要解析路由模型而不是控制器的功能。然后,该模型会自动注入控制器模型属性。
余烬方式
以余烬的方式,我建议将此模型定义移动到控制器的路由中。像这样的东西。
export default Ember.Route.extend({
model: function (param) {
return this.store.find('zone');
}
});
这是余烬做事的方式。解析路由中的模型,然后让控制器对其进行过滤/装饰。
我还建议使用ArrayController而不是Controller,因为您正在处理许多模型。
另一种方式
如果要在控制器中解析模型,请再次使用。我警告你这不是余烬的方式,但你可以这样做——
export default Ember.ArrayController.extend({
//dont override the model property
mydata: function () {
return this.store.find('zone');
}.property('model'),
});
我想出了问题——我只需要将我覆盖的model
实现设置为属性,如下所示:
app/controllers/zones.js
(注入控制器):
export default Ember.Controller.extend({
model: function () {
return this.store.find('zone');
}.property() // `.property()` turns the function into an iterable object for use in templates and the like.
});
主控制器仍然相同。
app/controllers/zones/index.js
(活动路由控制器):
export default Ember.Controller.extend({
needs: ['zones'],
zones: Ember.computed.alias('controllers.zones.model')
});