Ember.js 如何在控制器中使用余烬模型属性?

Ember.js 如何在控制器中使用余烬模型属性?,ember.js,Ember.js,我有一个模型: export default DS.Model.extend({ name: DS.attr('string'), things: DS.hasMany('match', {async: true, defaultValue: []}) }); 我可以在模板中迭代内容: {{#each model.things as |thing|}} <h3>thing.title</h3> {{/each}} 现在忘记过滤,如果我尝试按如下方式迭代

我有一个模型:

export default DS.Model.extend({
  name: DS.attr('string'),
  things: DS.hasMany('match', {async: true, defaultValue: []})
});
我可以在模板中迭代
内容

{{#each model.things as |thing|}}
    <h3>thing.title</h3>
{{/each}}
现在忘记过滤,如果我尝试按如下方式迭代这些
displayThings

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')
});
{{#each displayThings as |thing|}}
    <h3>thing.title</h3>
{{/each}}
{{#每个都将事物显示为|事物}
事物名称
{{/每个}}
模板中没有显示任何内容。我可以使用
console.log
验证
对象是否在控制器属性中,并且某些对象正在被发送到模板,但不是可以以某种方式进行迭代的对象


我使用的是Ember 1.13。

过滤的关键部分没有包含在您的代码中,并且可能存在您从
displayThings
返回的内容不可编辑或其他原因。此外,@torazaburo在对您的问题的评论中指出,您正在返回
内容
,您可能希望返回内容的过滤版本

最后,也是非常重要的一点,您的
displayThings
属性不仅应取决于
state
,还应取决于
model.things
或其某些变体,具体取决于实际的筛选。例如,如果您正在按特定字段
状态
筛选
内容
集合,则
显示内容
还应该声明一个依赖项,如下所示:

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
中公开其
状态
严格大于控制器的
状态
属性的所有
对象的集合。这应该可以做到这一点,并且应该通过更改过滤函数和相应地更新依赖项声明(如上所述),轻松地适应其他一些过滤条件。

您不想要
This.get('model.things')
?顺便说一下,
things
的默认值是不必要的。另外,要意识到您的
displayThings
computed属性正在返回
things
。你不想让它返回一些过滤版本的
东西吗
?你的观察者会计算过滤后的数据,但返回值不会出现在任何地方。如果我没弄错的话,它应该是余烬计算的。是的,谢谢。你完全正确。出于某种原因,每次我在代码中表示
computed
,我都会写
observer
。我现在修复了代码示例。