如何在Emberjs中将过滤后的数组添加到模型中

时间:2015-09-15 17:49:55

标签: javascript ember.js

我有一个我作为组件呈现的产品列表。

这是我的模板

<p>{{product.name}}</p>
<p>{{product.description}}</p>
<p>{{product.price}}</p>
<p>{{product.productCategory.id}}</p>
{{#product-line-item product.lineItems}}
{{/product-line-item}}

我正在尝试将过滤后的数组(product.lineItems)传递给组件,以便我可以指示购物车中每个产品的数量。我在模型中尝试做的事情似乎不正确。

以下是我尝试在产品模型上为属于该产品的lineItem创建数组:

export default Ember.Route.extend({
  model() {
    return Ember.RSVP.hash({
      products: this.store.findAll('product'),
      productCategories: this.store.findAll('productCategory'),
      lineItems: this.store.queryRecord('lineItem', { user_id: this.get('session.secure.user_id') })
    }).then(function (model) {
      model.products.forEach(function(product){
        product.lineItems = [];
        model.lineItems.forEach(function(lineItem) {
          if (lineItem.productId === product.id) {
            product.lineItems.pushObject(lineItem);
          }
        })
      });
      return model
    });
  }
});

首先,每个产品最终都有一个空的lineItems数组。

其次这感觉不对。我吠叫错了树吗?

2 个答案:

答案 0 :(得分:1)

理想情况下,lineItems属于product。但是,可以在不改变模型之间关系的情况下完成所需的操作。但是我需要假设一些事情:

  • 所有3个请求/承诺解决而非空数组
  • lineItem的属性productId与某些product.id匹配,因此过滤器可以正常使用

试试这个:

export default Ember.Route.extend({
  model() {
    return Ember.RSVP.hash({
      products: this.store.findAll('product'),
      productCategories: this.store.findAll('productCategory'),
      lineItems: this.store.queryRecord('lineItem', { user_id: this.get('session.secure.user_id') })
    }).then(model => {
      model.products.forEach(product => {
        let lineItems = [];
        model.lineItems.forEach(lineItem => {
          if (lineItem.get('productId') === product.get('id')) {
            lineItems.pushObject(lineItem);
          }
        })
        product.set('lineItems', lineItems);
      });
      return model;
    });
  }
});

答案 1 :(得分:0)

这是我更新的代码。我让它变得过于复杂。我只是在每个名为numberOfLineItems的产品上声明一个新属性,并指定数量(如果适用),否则为0.

export default Ember.Route.extend({
  model() {
    return Ember.RSVP.hash({
      products: this.store.findAll('product'),
      productCategories: this.store.findAll('productCategory'),
      lineItems: this.store.queryRecord('lineItem', { user_id: this.get('session.secure.user_id') })
    })
  },
  afterModel: function(model) {
    model.products.forEach(function(product){
      // product.lineItems = [];
      product.numberOfLineItems = 0
      model.lineItems.forEach(function(lineItem) {
        if (lineItem.get('product.id') === product.id) {
          product.numberOfLineItems = lineItem.get('quantity');
        }
      })
    });
    return model
  }
});