计算模型的长度

时间:2015-07-02 17:46:52

标签: javascript ember.js ember-data

我有这个productsCount计算属性,它应该计算所有products,但它总是返回0.为什么这样,我该如何解决?

controller.js

productsCount: Ember.computed('model.products', function() {
  var products = this.get('model.products');
  return products.get('length');
}),

route.js

import Ember from 'ember';

export default Ember.Route.extend({
  model: function() {
    return {
      products: this.store.find('product')
    };
  }
});

1 个答案:

答案 0 :(得分:9)

计算属性中传递的model.products只会在调用this.get('model').set('products', [...])时触发。但是因为products是一个类似于对象的数组,当有人调用length时,products.pushObject(...)属性可能会被更改,因为products数组引用不会导致计算属性重新计算改变了,只是你的内容。

要解决此问题,您必须将.length添加到计算属性相关键,如下所示:

productsCount: Ember.computed('model.products.length', function() {
  return this.get('model.products.length');
})

由于您只是对属性进行别名,因此您可以利用Ember.computed.alias,并将代码简化为:

productsCount: Ember.computed.alias('model.products.length')

Ember.computed.*中有其他非常有用的计算宏,您可能需要查看docs以获取更多信息