我有一个具有计算属性的视图。当依赖关系得到更新时,观察者会正常触发,但计算属性不会。可能是什么原因?
在把手中:
{{#view viewName currencyBinding="changingValue"}}
{{view.prefix}}
{{/view}}
在视图中:
prefix: (function() {
//does not get called!!!
console.log('computed property fired');
return this.get('currency');
}).property('currency')
observeCurrency: (function() {
//gets called!
return console.log('observer fired');
}).observes('currency')
更新'changingValue'时会触发观察者,但属性不会! 如果我在观察者中设置'前缀':
observeCurrency: (function() {
//gets called!
console.log('observer fired');
return this.set('prefix', this.get('currency'));
}).observes('currency')
除非我明确地重新呈现视图,否则我的html不会更新。为什么会这样?
答案 0 :(得分:4)
如果没有你的所有代码,很难说是什么,但让我们看看...... 所以也许您应该像我在评论中所说的那样删除计算属性周围的包装,因此您的视图将具有看起来像这样的属性:
SomeView: Em.View.extend({
// other stuff...
prefix: function() {
console.log('prefix being called');
// code that returns something goes here
}.property('currency'),
// other stuff...
})
现在我认为是问题所在,我已经做了一个模拟这种情况的小提琴,你可以在其中指出你想要的货币,并且计算属性有一个逻辑来确定什么是前缀。 (您可以看到来源here)。
在您的代码中,绑定changingValue
时,您没有指定此属性的来源,您将Ember无法解析的路径传递到应用程序中对象的属性。在我写的小提琴中,请注意属性changingValue
属于我的应用程序(我将其命名为SomeApp)。然后这个属性的路径是SomeApp.changingValue
,我在把手中的绑定最终是:
{{view SomeApp.SomeView currencyBinding="SomeApp.changingValue"}}'
另外,请注意,在那个小提琴上,我创建了一个子视图,它将content
属性与来自父视图的货币值绑定在一起。我只在那里添加了它,以便您可以看到如果您的代码中的属性changingValue
属于父视图,路径将如何。
我希望这会有所帮助。