Ember.JS计算属性

时间:2013-07-01 20:52:04

标签: javascript ember.js

我正在尝试使用Ember ObjectController创建一些计算属性,并遇到一些困难。我的对象(Baz)包含一个对象数组(Foo)。每个Foo都有一些键/值对,我们称之为alpha和beta。

使用这样的代码:

App.BazController = Ember.ObjectController.extend({
    total: function() {
        return this.get('foos').getEach('alpha').reduce(function(accum, item) {
            return accum + item;
        }, 0);
    }.property('foos.@each.alpha')
});

我可以计算每个Foo对象的'alpha'属性的总和,但我想计算特定Foos之间的值,理想情况是由它们的内置ID选择。我尝试了各种各样的表达式来尝试从数组中选择一个单独的Foo对象,但我似乎无法弄明白。

这可以在ObjectController中完成,还是尝试计算这些值的错误位置?

非常感谢从代码到概念演练的任何帮助。

干杯, 阿伦

1 个答案:

答案 0 :(得分:2)

您可以在构建item时访问reduce方法中total的属性。例如,要查找产品总数,但仅限于inStockonSale,您可以使用。

totalByReduce: function() {
  return this.get('model').reduce(function(total, product) {
    if (product.get('inStock') && product.get('onSale')) {
      return total + product.get('price');
    } else {
      return total;
    }
  }, 0);
}.property('model.@each')

同样,如果您在多个阶段进行过滤,即: - 过滤然后减少,您可以有2个不同的计算属性,它们相互依赖。例如,如果您只展示inStockonSale

的产品
saleProducts: function() {
  return this.get('model').filter(function(product) {
    return product.get('inStock') && product.get('onSale');
  });
}.property('model.@each'),

然后获取total saleProducts你可以设置第二个计算属性,

total: function() {
  return this.get('saleProducts').reduce(function(total, product) {
    return total + product.get('price');
  }, 0);
}.property('saleProducts.@each'),

这是一个jsbin示例。