0

これが私の状況です。

// 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}} €&lt;/span>
{{/each}}

CheapSource 計算プロパティを設定するにはどうすればよいですか? 私は次のようなことをしなければならないと思います:

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

問題は、(handlebars {{#each}} ヘルパーを使用する以外に) hasMany 関係をループする方法と、計算されたプロパティが別のモデルからの単一の Ember データ レコードで構成できるかどうかがほとんどわからないことです。sources.@each はどういうわけかこれに影響しますか? もしそうなら、どのように?

どんな助けやアイデアも大歓迎です、ありがとう。

4

3 に答える 3

1

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}} €&lt;/span>

大量のコードがなくても問題なく動作します。

于 2017-02-18T17:53:56.353 に答える
0

時間があれば、このソリューションも試してください。this.get('priceSources')それはPromiseを返すので、thenメソッドで結果にアクセスし、それをDS.PromiseObjectでラップして、テンプレートの通常のオブジェクトのようにアクセスできるようにする必要があります。

cheapestSource: Ember.computed('priceSources.@each.price', 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;
            })
        });
    })
于 2017-02-18T18:06:39.750 に答える