Ember计算属性不起作用

时间:2012-12-06 06:39:09

标签: ember.js javascript-framework handlebars.js

我有一个具有计算属性的视图。当依赖关系得到更新时,观察者会正常触发,但计算属性不会。可能是什么原因?

在把手中:

{{#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不会更新。为什么会这样?

1 个答案:

答案 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属于父视图,路径将如何。

我希望这会有所帮助。