Ember:返回值或从Ember promise中设置模型属性

时间:2016-05-31 09:37:27

标签: ember.js

更新 - 下面有更多信息

如果我有承诺,是否可以从中返回一个值?

let itemData = [];
model.data.get('products').then(relatedItems => {
  relatedItems.forEach(function(item,index) {
    console.log(item.get('name')); // Product 1, Product 2 etc
    itemData.pushObject(item);
  });
},reject => {
  console.log('error '+reject);
});

如果我在promise解决后尝试返回itemData数组,我将得到未定义。

或者(并且最好)我希望能够在承诺解决后设置模型属性:

// component code 

itemData:null,
init() {
  let model = this.get('data');
  model.data.get('products').then(relatedItems => {
     relatedItems.forEach(function(item,index) {
        this.set('itemData',item);
     });
  },reject => {
     console.log('error');
  });
}

所有这一切的原因是我需要对我只能通过承诺访问的产品项进行排序(在本例中)。设置itemData属性后,我打算做:

sortedItems:computed.sort('itemData','sortProperties'),
sortProperties:['name:desc']

更多信息:

在我的产品路线中,product.items.item我有一个分页组件

 {{pagination-item-trad data=model}}

路线product.items.item中的模型钩子是

  model(params) {
    let itemModel = this.store.findRecord('product',params.id);
    let mainModel = this.modelFor('product.items');

    return Ember.RSVP.hash({
       data:itemModel,
       mainData:mainModel
    });
} 

mainModel将包含该特定产品项的类别模型。

由于产品类别模型与产品存在多对多关系,因此我需要使用承诺访问组件中的产品数据,这在我需要对产品数据进行排序之前不会出现问题。我想要做的是从promise(itemData下面)获取产品信息,然后在计算属性中使用它。那么问题是我如何从承诺中提取数据以供代码中的其他地方使用?有没有更好的方法来实现这一目标?我希望这更清楚!

 sortedItems:computed.sort('itemData','sortProperties'),
 sortProperties:['name:desc']

更详细的组件:

 import Ember from 'ember';
 const {computed} = Ember;

 export default Ember.Component.extend({
   itemData:null,  // i would like to set this within the promise
   sortedItems:computed.sort('itemData','sortProperties'),
   sortProperties:['name:desc'],
   init() {
    let allData = this.get('data');
    let mainModel = allData.mainData;
    var self = this; 
    let itemData = [];
    mainModel.data.get('products').then(relatedItems => {
        relatedItems.forEach(function(item,index) {
        console.log(item.get('name')); // prints Product 1 etc etc
        itemData.pushObject(item);
    });
    self.set('itemData',itemData); // I can't do this
    },reject => {
      console.log('error '+reject);
    });
  }
  // rest of code omitted for brevity
});

1 个答案:

答案 0 :(得分:0)

您的forEach内的范围错误,this不再指向您的组件。您可以使用另一个胖箭头或使用变量维护对组件范围的引用。

此外,我怀疑你是否意味着在每次迭代时迭代并覆盖itemData