2016-11-07 1 views
0

storeデータをロードする最も適切なライフサイクルは、どのライフサイクルがEmber.Componentですか?Emberコンポーネントがストアデータをロードする

データを非同期でロードしています。だから私は実際のデータをrouteからロードしていないのですが、そのメタデータは?

たとえば、著者のnameに基づいた書籍のリストと、publisherのリストがロードされています。 (これは単なるイラストです)。

著者のリストと出版社のリストがあります。

コード:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
    return Ember.RSVP.hash({ 
     authors: this.store.findAll('author'), 
     publishers: this.store.findAll('publisher') 
    }); 
    } 
}) 

routeからauthorspublishersを取得した後、今、私たちは本を得るために、すなわちthis.store.find('book', {author, publisher})を別のクエリを行うことができます。

Ember.Componentのどのライフサイクルが非同期的にこのようなデータをフェッチするのが適切かを尋ねたがっています。

更新:

この問題は、次の3通りの方法でロードロジックを置くことによって解決することができます:route内部setupController

  1. 。コンポーネントのライフサイクルのroute

  2. model()フックで

考察(同僚との読書と議論)の後、コンポーネントは論理を考慮する必要があります。下の私の答えを見てください。

答えて

0

私はそれをチェーンすることができました。

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
    return Ember.RSVP.hash({ 
     m1s: this.store.findAll('meta1'), 
     m2s: this.store.findAll('meta2') 
    }).then(({m1, m2}) => { 

     let data = []; 
     m1s.forEach((m1) => { 
     m2s.forEach((m2) => {  
      this.store.query('modelName', { 
       m1.get('id'), 
       m2.get('id') 
      }); 

     }); 

     }); 

    }); 
    } 
}), 

あなたはしかし、あなた自身のadapterserializerを記述する必要があります。

0

init()フックは、データを要求したい場所です。

import Component from 'ember-component'; 
import injectService from 'ember-service/inject'; 

export default Component.extend({ 
    store: injectService(), 

    posts: [], 

    init(){ 
    this._super(...arguments); 

    this._getPosts(); 
    }, 

    _getPosts() { 
    this.get('store').findAll('post').then((posts) => { 

     // because this is async you need to guard against the component 
     // being destroyed before the api call has finished because 
     // because `this.set` will throw an error. 
     if (this.isDestroyed) { return; } 

     this.set('posts', posts); 
    } 
}); 
+0

参考資料はありますか?私は 'didInsertElement'がおそらく[サードパーティのライブラリと統合する]ことを知っていましたが、人々が' didInsertElement'フックでデータを読み込むのを見ました(https://guides.emberjs.com/v2.6.0/components/the-component-lifecycle/ )。ありがとうございました。 –

+0

それはあなたのために働いたアラン?できるだけ早くデータの要求を開始する必要があります。 – kiwiupover

+0

これはデータを収集する "Ember Way"ではないので、これは文書化されていません。エバーの方法は、ルート内のデータを取得し、それをコンポーネントに渡すことです。 – kiwiupover

関連する問題