2017-02-18 81 views
0

這裏是我的情況,簡化爲:Ember用hasMany關係檢索一條記錄的計算屬性?

// model/price-source.js 

export default DS.Model.extend({ 
    price: DS.attr('number'), 
    product: DS.belongsTo('product') 
)}; 

// model/product.js 

export default DS.Model.extend({ 
    priceSources: DS.hasMany('price-source') 
)}; 

在我的產品模板,我希望能夠簡單地引用源用最低的價格,就像這樣:

// templates/products.hbs 

{{#each model as |product|}} 
<span>{{product.cheapestSource.price}} €</span> 
{{/each}} 

我怎麼會去關於設置cheapestSource計算屬性?我想我不得不做這樣的事情:

// model/product.js 

    cheapestSource: Ember.computed('priceSources', function() { 
    let sources = this.get('priceSources'); 
    let cheapest = sources.get('firstObject'); 

    // iterate over sources and set cheapest to whichever has the lowest price 

    return cheapest; 
    }) 

的問題是,我根本不知道如何通過的hasMany關係循環(除了使用把手{{#each}}幫手),和計算出的屬性是否可以包含來自另一個模型的單個Ember Data記錄。是否有消息來源,如果有的話,怎麼玩?

任何幫助和想法表示讚賞,謝謝。

回答

0

我通過將priceSources整理到計算屬性sortedPrices中,然後調用模板中sortedPrices的firstObject來實現它。將立即用實際的解決方案編輯這篇文章。

它花了很長時間來測試,因爲我沒有意識到註釋句柄塊會破壞html內部的渲染。注意自我...


編輯:這做到了:

export default DS.Model.extend({ 
    priceSources: DS.hasMany('price-source'), 
    sortProperties: ['price:asc'], 
    sortedSources: Ember.computed.sort('priceSources', 'sortProperties') 
}); 

然後在模板:

<span>{{product.sortedSources.firstObject.price}} €</span> 

工程確定,沒有一噸的代碼。

0

這可以在需要使用cheapestSource的控制器上執行。

cheapestSource: Ember.computed('priceSources', function() { 
     let sources = this.get('priceSources'); 
     let cheapest = sources.get('firstObject'); 
     let array = sources.mapBy("price"); 
     let min = array.reduce(function(a, b, i, array) {return Math.min(a,b)}); 
     sources.forEach(function(source){ 
      if (source.get("price") == min){ 
      cheapest = source; 
      } 
     }); 
    return cheapest; 
    }) 

模型是有點難以實現你想要的這是爲什麼使用一個計算和模板後渲染計算成爲你需要的對象。

cheapestSource: Ember.computed('priceSources', function() { 
     let product = this; 
     this.get('priceSources').then((sources)=>{ 
     let array = sources.mapBy("price"); 
     if(array.length>0){ 
     let min = array.reduce(function(a, b, i, array) {return Math.min(a,b)}); 
     sources.forEach(function(source){ 
      if (source.get("price") == min){ 
      product.set("cheapestSource", source); 
      } 
     }); 
     } 
    }); 
    }) 

當我有這樣我使用主動型適配器on Rails和作爲產品的一部分,在我的自定義序列返回例如cheapestSourcePrice然後在灰燼產品型號只需添加問題cheapestSourcePrice和模板{{} product.cheapestSourcePrice }你不要t want ember to do heavy lifting like this but if you don t控制服務器然後這樣做。在將源設置爲cheapesetSource之後,還有一件事情就是在刷新之前不再進行計算。如果你需要它留計算,您必須對模型增加一個屬性然後設置他insted的例子

cheapestSource2:DS.attr()

這將允許它是一個對象

產品。設置(「cheapestSource2」,來源);

,然後在模板 {{product.cheapestSource}} {{product.cheapestSource2.price}}

您撥打第一個屬性是有這麼計算被調用。

+0

我正在閱讀[作爲承諾的關係](https://guides.emberjs.com/v2.11.0/models/relationships/#toc_relationsships-as-promises)指南。我們可以像你一樣直接訪問它嗎?如果可能的話,在你的答案中解釋..只是爲了我的學習。謝謝。還有依賴鍵'priceSources。@ each.price'可能會有用。一旦你閱讀,我將刪除我的評論 – kumkanillam

+0

我在控制器上做了這個,現在我明白你爲什麼要問這個問題,他在模型thx中做了檢查。 –

+0

@ Sedad.Kosovac不幸的是沒有priceSource對象顯示出來(在Ember Inspector中)。我沒有得到錯誤。我嘗試了'return this.get('priceSources')。get('firstObject')',也試過'返回this.get('priceSources.firstObject')',但沒有。 因爲我將需要排序來源,更好的方法來獲得最便宜的可能是首先排序,然後檢索sortedSources計算屬性中的firstObject。 –

0

如果你有時間也試試這個解決方案。 this.get('priceSources')它返回Promise,所以你需要訪問方法中的結果並將其包裝在DS.PromiseObject中,以便可以像訪問模板中的普通對象那樣訪問它。

cheapestSource: Ember.computed('[email protected]', function() { 
     return DS.PromiseObject.create({ 
      promise: this.get('priceSources').then(sources => { 
       let resultObj = {} 
        //sources is normal array you can apply your logic and set resultObj 
       return resultObj; 
      }) 
     }); 
    }) 
+0

這是應該進入組件(或控制器)或模型?嘗試它在模型中,得到這個: 'Uncaught TypeError:this.get(...)。然後不是一個函數',我認爲這將是一個很好的解決方案,因爲我希望在排序源文件後將其作爲計算屬性最便宜,例如在' source =>'函數,我可以只返回sources.firstObject,sources.get('firstObject'),sources [0]或其他任何正確的語法 –

+0

您可以在模型中定義它,默認爲'priceSources:DS。 hasMany('price-source',{async:true})'。如果async屬性爲true,那麼它返回Promise,所以'then'是一件事,如果它的false返回DS.ManyArray,那麼'then'不是你的事情,所以你會出現這個錯誤,我沒有找到任何例子,我只是希望這個[用於加載的燼點火器文章](ht tps://emberigniter.com/guide-promises-computed-properties/)@VilleLehtinen – kumkanillam