EmberJS Observer没有被解雇

时间:2015-05-27 19:10:24

标签: javascript ember.js

EmberJSBin here

我有一个组件需要在更改任何值时执行给定的操作,但是我创建的观察者不会触发:

export default Ember.Component.extend({
    taxes: null,
    NOAYears: 2,
    NOAValues: Ember.computed("NOAYears", function() {
        var NOAs = [],
            lastYear = new Date().getFullYear() - 1;
        for (var year = 0; year < this.get("NOAYears"); year++) {
            NOAs.push({year: lastYear - year, value: 0});
        }
        return NOAs;
    }),
    NOAYearsChanged: function() {
        // does not fire when any of the values change
    }.observes("NOAValues.@each.value")
});

在组件模板中,我通过{{#each}}迭代器:

进行绑定
{{#each NOAValues as |year|}}
    <label for="{{year.year}}-value">{{year.year}}</label>
    {{input min="0" step="any" value=year.value required=true placeholder="Yearly Income"}}
{{/each}}

value中的NOAValues个属性发生变化时,如何让我的观察者触发?

2 个答案:

答案 0 :(得分:2)

此问题已被验证为由遗留代码引起的错误,遗留代码将以大写字母(即PascalCase)开头的任何属性名称解释为全局或类名称引用...使属性不可观察。

来源:https://github.com/emberjs/ember.js/issues/10414

似乎会努力在即将发布的版本中修复它。

答案 1 :(得分:0)

为了观察属性更改,您需要为给定属性使用setter。我想你介绍一个扩展Ember的NOA模型。它应该足够了。例如:

// file app/model/noa.js
export default Ember.Object.extend({
  year: undefined,
  value: undefined
});

然后替换它:

for (var year = 0; year < this.get("NOAYears"); year++) {
  NOAs.push({year: lastYear - year, value: 0});
}

for (var year = 0; year < this.get("NOAYears"); year++) {
  NOAs.push(app.model.noa.create({year: lastYear - year, value: 0}));
}

您应该会看到一些属性更改。