【问题标题】:Computed @each property isn't updated计算的@each 属性未更新
【发布时间】:2015-12-02 13:09:19
【问题描述】:

我使用的是 ember 2.1.0 我有 2 个模型 - testGroup

export default DS.Model.extend({
tag: DS.attr('string'),
crvs: DS.hasMany('crv'),
skus: DS.hasMany('sku'),
isSKU: DS.attr('boolean', {defaultValue: true})
});

和 crv。

import DS from 'ember-data';

export default DS.Model.extend({
    tag: DS.attr('string'),
    ctr: DS.attr('number', {defaultValue: 10}),
    convs: DS.attr('number', {defaultValue: 10}),
    testGroup: DS.belongsTo('testGroup')
});

在组件模板中,我显示了 testGroup.crvs 中的所有项目,并且能够更改 ctr/convs。

{{#each model.crvs as |crv|}}
    <tr>
        <td>{{crv.tag}}</td>
        <td>{{input value=crv.ctr}}</td>
        <td>{{input value=crv.convs}}</td>
    </tr>
{{/each}}

最后我想显示总数:

<div>Phases: {{total}}%</div>

对于这个问题,我在我的组件中创建了一个计算属性:

total: Ember.computed('model.crvs.@each.convs', function() {
    var crvs = this.get('model').get('crvs');
    if (crvs) {
        var tmp = 0;
        crvs.forEach(function(crv) {
            tmp += parseFloat(crv.get('convs'));
        });
        return tmp;
    } else {
        return 0;
    }
}),

它在页面呈现时显示正确的值,但是当我更改 crvs 集合中的值时,计算的属性没有改变。我可以在 ember 控制台中看到新的价值。

我的财产有什么问题?

更新 我发现了奇怪的行为。 CRVs 集合带有来自服务器的测试组:

{
            'testGroup': {
                'id': 12,
                'tag': 'foo',
                'crvs': [1, 2]
            },
            'crvs': [
                {
                    id: 1,
                    tag: 'crv1234',
                    ctr: 10,
                    convs: 6,
                    testGroup: 12,
                },
                {
                    id: 2,
                    tag: 'crv1235',
                    ctr: 10,
                    convs: 7,
                    testGroup: 12,
                }
            ]
        }

对于这个集合,计算属性不起作用。但是,如果我更改为用户在 UI 中添加的 model.skus 集合,如下所示:

var sku = this.get('targetObject.store').createRecord('sku', {
                catalogName: this.get('catalog').displayName,
                testGroup: this.get('model'),
                id: this.get('sku').sku,
                value: this.get('skuValue')
            });
            this.get('model').get('skus').pushObject(sku);

然后计算属性对于此类项目可以正常工作。 所以这种行为对我来说很奇怪。

【问题讨论】:

  • `我可以在 ember 控制台中看到新值`是什么意思?您可以在控制台中看到哪些新值?它是如何到达那里的?
  • 我的意思是 Chrome 的 Ember 插件。您可以在哪里看到模型及其值。 CRV 模型中的值已更改,但计算属性仅在页面渲染时触发一次,不再触发:(
  • 嗯,我看不出有什么明显的错误。您确定计算的属性没有再次运行吗?您是否尝试过在其中放置断点?
  • 是的,它不起作用。我把console.log放在里面,它只工作一次:(
  • 在您提供给我们的代码中,我唯一能看到(可能)错误的是您的属性是一个数字,而 input 很可能将其设置为字符串值。我看不出这会有什么不同,但我看不到其他任何东西。如果您使用crv.set()(而不是在输入框中输入)手动更改控制台中的值会发生什么?

标签: ember.js


【解决方案1】:

我想我遇到了同样的问题。有一个 bug with Ember 2.1/2.2 会破坏使用 @each 的关系的计算属性。

有一个解决方法:使用content.@each 而不是@each

total: Ember.computed('model.crvs.content.@each.convs', function() {
    var crvs = this.get('model').get('crvs');
    if (crvs) {
        var tmp = 0;
        crvs.forEach(function(crv) {
            tmp += parseFloat(crv.get('convs'));
        });
        return tmp;
    } else {
        return 0;
    }
}),

Pedro Rio 的参考答案:Model Computed Property not updating

【讨论】:

  • 非常感谢。它有帮助
【解决方案2】:

试试这个:

使用[] 而不是'@each'

total: Ember.computed('model.crvs.[].convs', function() {
    var crvs = this.get('model').get('crvs');
    if (crvs) {
        var tmp = 0;
        crvs.forEach(function(crv) {
            tmp += parseFloat(crv.get('convs'));
        });
        return tmp;
    } else {
        return 0;
    }
}),

【讨论】:

  • [] 用于需要通知数组更改而不是属性时。但是我也试过了,还是不行
  • 不,@each 是正确的。 [] 仅适用于您想要观察添加到数组中或从数组中删除的项目时。 @each 用于当您想要观察该数组中项目的属性时。 emberjs.com/api/classes/Ember.Array.html#property__each
【解决方案3】:

您计算错误的财产。 crvs 中只有一个convs,而model 中有多个crvs

Ember.computed('model.@each.crvs.convs', function() {

【讨论】:

  • 不,来自 ember 文档:剩余:Ember.computed('todos.@each.isDone', function() {...}
  • model.@each 表示模型是一个数组。
  • 我有模型(testGroup),其中包含 CRV 模型的 crvs 数组。并且 CRV 模型具有 convs 属性
  • 麦克斯,你所拥有的是对的。我只是在回复亨利。
  • 你在文档中有这个,因为todostodos: [{object},{object},{object}]。这就是为什么有todos.@each.isDone
猜你喜欢
  • 2014-07-21
  • 2019-04-18
  • 2012-03-05
  • 2020-08-11
  • 2014-03-01
  • 2019-10-03
  • 2017-07-29
  • 2016-03-07
相关资源
最近更新 更多