5

詳細: ember-data-1.0.0.beta.3 およびデフォルトの RESTAdapter

メソッドの仕組みを誤解している可能性がありますstore.find()が、私の理解では、求めているレコードが既にストアに存在する場合、次のコードはサーバーにクエリを実行するべきではありません。

var IndexRoute = Em.Route.extend({
    model: function() {
       return this.store.find('link');
    },
});

のemberjs.comドキュメントからDS.Store.find()

find メソッドは常に、レコードで解決される promise を返します。レコードが既にストアにある場合、Promise はすぐに解決されます。それ以外の場合、ストアはアダプターの find メソッドに必要なデータを検索するように要求します。

まったく同じモデル フックを持つ別のルートがありますが、そのルートにアクセスすると、データが既にストアにあるにもかかわらず、サーバーにクエリが実行されます。Index ルートに戻ると、再度クエリが実行されます。これを処理する必要はありません.find()か?

4

1 に答える 1

17

find メソッドは常に、レコードで解決される promise を返します。レコードが既にストアにある場合、Promise はすぐに解決されます。それ以外の場合、ストアはアダプターの find メソッドに必要なデータを検索するように要求します。

これは、 id で検索するときに機能しthis.store.find('link', 1)ます。Usingthis.store.find('link')は常にサーバーでリクエストを実行します。

allメソッドを使用してローカル データを取得できますthis.store.all('link')。ただし、アプリのどこかで、findメソッドを使用してそのデータをプリロードする必要があります。それ以外の場合allは何も返しません。

以下を使用して、目的の動作を得ることができます。

App.ApplicationRoute = Ember.Route.extend({
    model: function() {
        // preload all data from the server once
        this.store.find('person');
    }
});

App.LinksRoute = Ember.Route.extend({
  model: function() {      
      // get the local data without request the server
      return this.store.all('person');
  }
});

App.OtherRoute = Ember.Route.extend({
  model: function() {
      // get the local data without request the server
      return this.store.all('person');
  }
});

私はこれでフィドルを作りましたhttp://jsfiddle.net/marciojunior/Az2Uc/を見てください

そのフィドルは jquery mockjax を使用します。ブラウザ コンソールがMOCK GET: /people1 回だけ表示されている場合、これは通常の xhr リクエストのようですが、嘲笑されています。ローカル データを取得するだけで、他の要求を実行せずに移行しpeople1ます。people2

于 2013-10-29T12:07:53.963 に答える