2012-12-06 59 views
1

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

在车把:

{{#view viewName currencyBinding="changingValue"}} 
    {{view.prefix}} 
{{/view}} 

在视图中:当 'changingValue' 更新

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') 

观察员被激发,但属性不! 另外,如果我在设定观察者“前缀”:

observeCurrency: (function() { 
    //gets called! 
    console.log('observer fired'); 
    return this.set('prefix', this.get('currency')); 
}).observes('currency') 

我的HTML没有得到更新,除非我的观点的明确重新呈现。为什么会发生?

+0

小提琴例子? – Manoharan

+0

除非我遗漏了一些你不必包装你的计算属性,它应该像'computedPropertyName:function {...} .property('dependency')' – MilkyWayJoe

回答

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

我希望这会有所帮助。