2016-05-31 66 views
0

更新 - 下面灰烬:返回一个值或一组从灰烬承诺一个模型属性

如果我有一个承诺,是有可能的更多信息从它返回一个值?

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); 
}); 

如果我尝试并在承诺解决后返回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将包含该特定产品的类别模型。

由于产品类别模型与产品有多对多关系,因此我需要使用承诺访问组件中的产品数据,直到需要对产品数据进行排序时,这并不是问题。我试图做的是从承诺(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 
}); 
+0

第5行有一个错字,缺少“'”: 'let model = this.get('data ^);' – Pavol

+0

您可以设置依赖于模型的计算属性吗? ('data.model.products',function(){ return this.get('data.model.products')。filter(...); });' – Pavol

+0

It wont因为他使用承诺而工作。 –

回答

0

你的范围内不对您forEachthis不再指向您的组件。您可以使用另一个胖箭头或使用变量维护对组件作用域的引用。

另外,我怀疑你的意思是迭代和覆盖itemData每次迭代。

+0

嗨主办,非常感谢回来。对不起 - 是的,我的意思是尝试并在forEach循环之外设置itemData!我已经做了一些调整,但仍然努力在这里达到预期的结果。如果我尝试在代码中的其他地方获取itemData(用于计算属性),我仍然未定义? – Newfoundland

+0

你还在哪里使用它,我只是看到了这种情况,你确定当你试图获得该财产时承诺已经解决了吗? – Kingpin2k

+0

是的,这个承诺已经解决了。如果我尝试按照我所示的方式设置itemData,我可以在组件js文件中的其他位置使用该值吗?我在设置组件属性之前做过类似的事情,但我只在模板文件中使用过......我能做到这一点吗?尝试设置此itemData属性并在计算属性中使用它来实现排序似乎是合理的吗?然后,我想在代码中其他地方的forEach循环中使用sortedItems。 – Newfoundland