组件上的ComputedProperty仅在监视属性第一次设置为给定值时更新(当属性是模型属性时)

时间:2014-09-10 20:31:52

标签: ember.js ember-data

我似乎在组件内部的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"),

这些更改将允许每次更改选择控件中的值时都会触发断点。

有谁知道可能导致此行为的原因是什么?我宁愿不想创建一个临时变量。

  1. http://jsbin.com/qeyite/1/edit?html,js,output

  2. http://jsbin.com/kugino/3/edit?html,js,output

  3. 两者之间的唯一区别是第一个bin正在objectA.objectB上存储和观看,而第二个bin正在tempObjectB上存储和观看。

1 个答案:

答案 0 :(得分:0)

对于偶然发现这一点的人来说,它似乎是在最新的Ember.js版本(1.8.1)中修复的。

https://github.com/emberjs/ember.js/issues/5578