如何获得一组 Ember 数据模型作为可以注入其他人的控制器



在我的 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')
});

最新更新