Javascript 计算模型的长度

Javascript 计算模型的长度,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我有这个productsCountcomputed属性,它应该计算所有products,但它总是返回一个0。这是为什么?我该如何修复它 controller.js productsCount: Ember.computed('model.products', function() { var products = this.get('model.products'); return products.get('length'); }), import Ember from 'ember

我有这个
productsCount
computed属性,它应该计算所有
products
,但它总是返回一个0。这是为什么?我该如何修复它

controller.js

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

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

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

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

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

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

productsCount: Ember.computed('model.products.length', function() {
  return this.get('model.products.length');
})
由于您只是对属性使用别名,因此可以利用并简化代码以:

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

Ember.computed.*
中还有其他非常有用的计算宏。您可能想查看更多信息

我怀疑问题是否在于CP“始终返回零”。你查过了吗?问题几乎是肯定的,CP“在长度改变时不会被调用”——这是因为,呃,你没有告诉它在长度改变时重新计算。