2015-12-12 50 views
0

我有一个模型:如何在控制器中使用Ember模型属性?

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。

+3

难道你不想'this.get('model.things')'?顺便说一下,“东西”的默认值是不必要的。另外,要实现你的'displayThings'计算属性返回'things'。你不想让它返回一些过滤的'things'版本吗? –

回答

0

过滤的关键部分不包含在您的代码中,并且可能存在您为什么从displayThings返回的内容不可迭代的原因。此外,正如@torazaburo在对您的问题发表评论时指出的那样,您将返回things,并且您可能希望返回过滤版本的内容。

最后,也是非常重要的一点,您的displayThings属性应该不仅取决于state,还取决于实际的过滤,取决于model.things或其某些变体。举例来说,如果你被一个特定的领域status过滤things集合,然后displayThings也应该有一个依赖声明如下图所示:

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

如果您的过滤条件并不仅仅是依赖于一个或两个更复杂集合的项目领域,那么也许你可以声明对整个集合对象的依赖,就像这样:

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

上面的代码指出,如果things集合变化,或者其任何对象以任何方式改变,然后displayThings属性重新计算。

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

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

上述控制器将在displayThings揭露所有thingsstatus严格小于控制器的state物业更大的集合。这应该能够实现,并且应该通过改变过滤函数并相应地更新依赖声明来轻松地适应其他一些过滤标准,如上所述。

+1

您的观察员计算过滤的数据,但返回值不会去任何地方。如果我没有弄错,它应该是'Ember.computed'。 –

+0

是的谢谢。你是完全正确的。出于某种原因,我每次写代码时都会写'观察者'。我现在修复了代码示例。 – Ernesto

相关问题