2016-05-31 62 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