2017-02-18 2 views
0

はここに私の簡素化の状況、です:私の製品テンプレートでhasMany関係から1レコードを取り出すためのEmber計算プロパティー?

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

問題があるが、私はどのように(離れてハンドル{{#each}}ヘルパーを使用してから)hasManyの関係をループに少し考えを持っており、計算されたプロパティが他のモデルからの単一のEmber Dataレコードで構成されることができるかどうか。ソースは@それぞれ何かがこれに参加していますか?

ご協力いただきありがとうございます。

答えて

0

priceSourcesを計算されたプロパティsortedPricesにソートしてから、テンプレート内のsortedPricesのfirstObjectを呼び出して作業しました。すぐに実際のソリューションでこの投稿を編集します。

ハンドルバーブロックをコメントアウトするとhtmlのレンダリングが中断されることはわかりませんでしたので、テストに時間がかかりました。自己...


EDITへの注意:これはそれをやった:テンプレートで次に

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> 

は、コードのトンせずに、[OK]を動作します。

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

モデルは少し難しいですが、これは1つの計算を使用し、テンプレートをレンダリングした後に必要なオブジェクトになります。

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

私はRailsの上のアクティブモデルアダプタを使用し、エンバーの製品モデルで、その後、私のカスタム・シリアライザに製品の一部として例cheapestSourcePriceのために戻る。このような問題を持っている場合だけcheapestSourcePriceを追加し、テンプレートで{{product.cheapestSourcePrice} }あなたはt want ember to do heavy lifting like this but if you donを制御していないので、このようにしてください。また、ソースをcheapesetSourceに設定した後のもう1つの点は、更新されるまでリソースが計算されなくなりました。あなたはそれを計算に滞在する必要がある場合は、モデルに1つのより多くのプロパティを追加する必要があり、その後に彼を設定する例をinsted

cheapestSource2:DS.attr()

それはオブジェクト

製品であるためにはこれができるようになります。 set( "cheapestSource2"、source);呼び出す

と、テンプレート における{{product.cheapestSource}}、{{}} product.cheapestSource2.price

最初のプロパティは、それほど計算があると呼ばれます。

+0

私はこの[約束としての関係](https://guides.emberjs.com/v2.11.0/models/relationships/#toc_relationships-as-promises)のガイドを読んでいます。あなたがやっているように直接アクセスできますか?可能であれば答えを説明してください。私の学習のために。また、従属キー 'priceSources. @ each.price'も有用かもしれません。 – kumkanillam

+0

コントローラでこれをやりましたが、なぜこの質問をしたのか、彼はチェックのためにモデルthxでそれを行いました。 –

+0

@ Sedad.Kosovac残念ながら、(Ember Inspectorの)priceSourceオブジェクトが表示されていません。私は間違いがない。私は 'return this.get( 'priceSources.firstObject')'を返そうとしましたが、返すthis.get( 'priceSources')。get( 'firstObject') 'も試みました。 とにかくソースをソートする必要があるので、最も安価なソースを取得するより良い方法は、最初にソートしてから、sortedSources計算プロパティでfirstObjectを取得することです。 –

0

時間がある場合は、このソリューションも試してください。 this.get('priceSources')プロミスを返すので、結果のメソッドにアクセスして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(...)。thenは関数ではありません'私はソースをソートした後に計算されたプロパティとしてもっとも安価にしたいので、 sources.firstObject、sources.get( 'firstObject')、sources [0]などの正しい構文を返すことができます –

+0

これは、モデルとデフォルトではpriceSources:DSで定義できます。もしasyncプロパティがtrueであればPromiseを返すので、 'then'は事であり、falseであればDS.ManyArrayを返すので、' then'は事ではありませんので、hasMany( 'price-source'、{async:true}) 'そのエラーを取得します。私はちょうどこのシムthroguhをどのような例で働いたhavent [負荷のためのemberイグナイターの記事](ht tps://emberigniter.com/guide-promises-computed-properties/)@VilleLehtinen – kumkanillam

関連する問題