如何在控制器中使用Ember模型属性?

时间:2015-12-12 02:27:41

标签: ember.js

我有一个模特:

export default DS.Model.extend({
  name: DS.attr('string'),
  things: DS.hasMany('match', {async: true, defaultValue: []})
});

我可以在模板中遍历things

{{#each model.things as |thing|}}
    <h3>thing.title</h3>
{{/each}}

但我不想要所有的东西。我只想展示其中一些。我将显示的将取决于控制器变量。所以我的想法是我在控制器中有一个计算属性,如下所示:

export default Ember.Controller.extend({
  state: 0,
  displayThings: function() {
    var things = this.get('model').things;
    var state = this.get('state');
    // do stuff, filter in a way that isn't important
    return things;
  }.property('state')
});

暂时忘记过滤,如果我尝试按以下方式迭代这些displayThings

{{#each displayThings as |thing|}}
    <h3>thing.title</h3>
{{/each}}

模板中没有显示任何内容。我可以使用console.log验证thing是否在控制器属性中,并且某个对象被发送到模板,但不是某个可以迭代的对象。

我使用的是Ember 1.13。

1 个答案:

答案 0 :(得分:0)

过滤的关键部分未包含在您的代码中,并且可能存在您从displayThings返回的内容无法迭代或其他原因的原因。此外,正如@torazaburo在对您的问题的评论中指出的那样,您正在返回things,并且您可能希望返回过滤版本的内容。

最后,非常重要的是,您的displayThings属性不仅取决于state,还取决于model.things或其中的某些变体,具体取决于实际过滤。例如,如果您按特定字段things过滤status集合,那么displayThings也应该声明如下所示的依赖关系:

displayThings: Ember.computed('state', 'model.things.@each.status', function() {
  // ...
})

如果您的过滤条件比仅依赖于集合项的一个或两个字段更复杂,那么您可以声明对整个集合对象的依赖,如下所示:

displayThings: Ember.computed('state', 'model.things.[]', function() {
  // ...
})

上面的代码指出,如果things集合发生更改,或者其中的任何对象以任何方式发生更改,则会重新计算displayThings属性。

现在,回到你原来的问题,我将通过在这里发布一个完整版本的控制器代码并实际进行假设过滤来解决问题。也许您可以通过修改此代码来应用您的实际过滤条件:

export default Ember.Controller.extend({
  state: 0,
  displayThings: Ember.computed('state', 'model.things.@each.status', function() {
    var state = this.get('state');
    return this.get('model.things').filter(function(thing) {
      return thing.get('status') > state;
    });
  })
});

上述控制器将在displayThings中公开所有things的集合,其status严格大于控制器的state属性。这应该可以解决问题,并且应该通过更改过滤功能并相应地更新相关性声明来轻松适应其他一些过滤标准,如上所述。