我似乎在组件内部的ember 1.7.0上有一些计算属性的问题。假设我有2个型号,A& B. A与B有“belongsTo”关系。
在我的组件模板上,我有一个Ember.Select控件,允许用户为A选择一个B条目。
{{view Ember.Select class="form-control" content=bList selection=objectA.objectB optionValuePath="content.id" optionLabelPath="content.name"}}
在我的组件中,我有一个计算属性,可以监视objectA.objectB
上的更改,如下所示:
isSomething: function() {
return this.get("objectA.objectB.id") === "some id";
}.property("objectA.objectB"),
然后在我的组件模板中,我会根据isSomething
:
{{#if isSomething}}
Something :D
{{/if}}
如果我在isSomething
计算属性中放置一个断点,并在select控件上选择一个新值,它会按预期命中断点。选择新值后,它会再次出现。但是,如果我再次选择原始值,断点将不会被击中(并且组件将不会重新渲染)。似乎只是在我第一次选择select控件中的任何给定值时。起初我认为这可能是缓存的问题,但是向该属性添加volatile()
似乎没有什么区别。
我可以通过将选择控件选择绑定到组件上的属性(如tempObjectB
),并将isSomething
监视的属性更改为tempObjectB
来解决此问题,如下所示:
isSomething: function() {
return this.get("tempObjectB") === "some id";
}.property("tempObjectB"),
然后,为了更新objectA
的参考,我可以使用一种方法来观察tempObjectB
的所有更改并更新objectA.objectB
,如下所示:
updateObjectA: function() {
this.set("objectA.objectB", this.get("tempObjectB"));
}.observes("tempObjectB"),
这些更改将允许每次更改选择控件中的值时都会触发断点。
有谁知道可能导致此行为的原因是什么?我宁愿不想创建一个临时变量。
两者之间的唯一区别是第一个bin正在objectA.objectB
上存储和观看,而第二个bin正在tempObjectB
上存储和观看。
答案 0 :(得分:0)
对于偶然发现这一点的人来说,它似乎是在最新的Ember.js版本(1.8.1)中修复的。