20

常にリクエストを行わないようにするには、 .all() メソッドを使用して、ストアに保持されているデータをロードできると言われました。しかし、Ember はどのようにキャッシュを処理するのでしょうか? いくつか質問があります。

キャッシュをどのように制御しますか? いつ .find() を使用し、いつ .all() を使用しますか。.find() を使用してから .all() を使用しますか? どれだけの時間?

.all() には有効期限があり、しばらくすると新しいリクエストを作成できますか? または、ローカル ストレージを使用しているため、手動でクリアする必要がありますか?

週に 1 回だけ更新したいデータがあるとします。これについてどうすればよいですか?同じルートを入力または再訪問するたびに、新しいリクエストが作成されます。どうすればこれを回避できますか?

4

2 に答える 2

21

だからあなたのコメントから質問に答えることから始めます:

アプリの起動時にデータをロードする方法を知りたいです (頻繁に更新する必要がないため、ルート経由ではありません)。出来ますか

技術的にはルート経由でも問題ありませんが、アプリの「開始」時にデータをロードする最善の方法は、アプリケーション ルートのモデル フックを経由することです。

App.ApplicationRoute = Ember.Route.extend({
  model: function({
    return App.Post.find();
  })
})

ルーターは find() によって返された promise を解決するまで待機するため、他のルートが入力される前にサーバーからの応答が返されたことを確認できます。

キャッシュをどのように制御しますか?

ほとんどの場合、それについて心配する必要はありません。必要に応じて、タイムアウト後に個々のレコードを refresh() できます。

いつ .find() を使用し、いつ .all() を使用しますか。.find() を使用してから .all() を使用しますか? どれだけの時間?

何を達成したいかによります。このアプリでは、アプリケーション ルートで find() を使用し、次に他のルートで all() または filter() を使用します。

.all() には有効期限があり、しばらくすると新しいリクエストを作成できますか?

いいえ。新しいリクエストを行うことはありません

または、ローカル ストレージを使用しているため、手動でクリアする必要がありますか?

ローカル ストレージを使用せず、レコードはメモリ内にあります。したがって、確実に F5 はキャッシュをクリアします。

週に 1 回だけ更新したいデータがあるとします。これについてどうすればよいですか?同じルートを入力または再訪問するたびに、新しいリクエストが作成されます。どうすればこれを回避できますか?

アプリケーション ルートでのみ find() を使用し、そのユーザーがブラウザを 1 週間開いたままにし、レコードの有効期限が切れたとします。更新には多くの方法があります。簡単/最善の方法は、すべてが一度に期限切れになるか、一度に 1 つずつタイムアウトするかによって異なります。

  • 期限切れのレコードをタイマーでチェックし、必要に応じて refresh() を呼び出します。
  • あるスケジュールで更新する Ping モデルを用意します。サーバーが更新に応答すると、変更されたレコードをサイドロードできます。
  • または、週に 1 回ブラウザを更新することもできます (window.location... 経由)。
于 2013-05-26T03:25:43.147 に答える
2

キャッシュと呼ばれるものはストアのコンテンツです。バックエンド側で行われた変更を反映するためにストアを更新するには、通常 2 つの方法があります。

  • 変更は、ユーザーの操作/サーバーへの呼び出しで発生します。バックエンド側で複数のレコードを更新する場合、そのリクエストの応答でそれらをサイドロードできます。
  • 変更はバックエンド側で非同期に発生します (バックグラウンド ジョブ)。Websocket を使用して、これらの変更をクライアントにプッシュできます。
于 2013-05-15T22:06:11.700 に答える