2014-09-02 76 views
0

我有返回布尔动态控制器财产,如果有关系计数低于5不叫控制器属性当我为关系添加新记录时,它不会改变。Ember.js:当属性改变

这是模型:

App.Item = DS.Model.extend({ 
    name: DS.attr(), 
    aliens: DS.hasMany('alien') 
}); 

我的aliens对象使用pushObject当我创建了一个新的纪录。

我不确定这应该怎么做,显然我没有正确地做。

演示:http://emberjs.jsbin.com/yegiku/2/edit

回答

0

the docs for @each看看 - 那就是观察到一个数组中的具体变化的特殊关键字。

在你的情况下,使用以下将工作(只观察者的火灾时,记录从阵列加入除去):

alienCountBelow5: function() { 
    return this.get('model').get('aliens.length') < 5; 
}.property('aliens.[]'), 
+0

它似乎没有工作。根据您的建议更新'alienCountBelow5'后,出现错误“无法读取未定义的属性”。然后,我尝试在关系中添加“{async:true}”,但之后我处于现状:http://emberjs.jsbin.com/yegiku/2/edit – 2014-09-03 09:59:14

+0

好吧,现在我看到您的代码了解了。它不工作的原因是因为你的'model'是记录的一个*数组*,因此把一个计算的属性放在你的'ArrayController'上将不会有用。相反,我把属性放在你的模型上(如果你不认为这是模型相关的逻辑),你也可以把它放在一个'ItemController'上。看到这里:http://emberjs.jsbin.com/poqobevukozo/1/edit – sheldonbaker 2014-09-03 17:35:40

+0

是的,我想通了。感谢“ArrayController”和“ItemController”的例子! – 2014-09-08 10:16:33

1

alienCountBelow5计算属性应该内App.Item来限定。并将您的模板更改为{{item.alienCountBelow5}}。我已更新您的jsfiddle

注意:不幸的是我不能得到它的工作,它会引发错误:Cannot read property 'resolve' of undefined。它的工作原理与answer相同。但你应该明白,并解决问题。此外,如果您使用

aliens: DS.hasMany('alien', {async: true})这种作品。

+0

啊哈,所以差异制造商是在模型上做到这一点:http://emberjs.jsbin.com/yegiku/2/edit – 2014-09-03 10:05:34

+0

但我认为控制器是装饰模型,所以这里的交易是什么?这是我对模型的光学装饰。 – 2014-09-03 10:06:32

+0

但是'alienCountBelow5'是单个物品模型的属性,您的控制器是'ArrayController',也就是说,它适用于所有物品模型。如果你有一个Item的控制器,那是最佳的,然后你可以拥有装饰器。 – user3995789 2014-09-03 10:09:20