0

ember-data の操作は驚くべきもので、箱から出してすぐにデータ処理の課題のほとんどに対応できます。ただし、答えを見つけようとして Google 検索を掘り下げている問題が 1 つあります。

サーバーに GET リクエストを送信して、レコードを検索するとしますApp.Fruit.find('banana');。このレコードが存在しない場合、バックエンドはクライアントにステータス コード (404) を返します。

ここで、後でいつでも、「バナナ」レコードが他の誰かによって作成され、サーバー上のデータベースに存在する可能性があります。

ただし、この時点でさらに を呼び出してもApp.Fruit.find('banana');、サーバーに新しい GET 要求は発行されません。

  • 両方banana = App.Fruit.find('banana');を呼び出してbanana.get('transaction').rollback();から、サーバーから 404 が返されたときに呼び出してみました。

  • また、それが機能するかどうかを確認しようとApp.store.get('defaultTransaction').rollback();しました。

  • 私はトランザクション状態を「削除済み」に設定しようとさえ試みました-そのように: -それが後で問題を新しいGETリクエストにbanana.get('stateManager').goToState('deleted');することを望んでいます。App.Fruit.find('banana');残念ながら、そうではありませんでした。

私の質問は、以前のリクエストでデータが返されなかった場合 (404)、ember-data に GET リクエストを再度発行させるにはどうすればよいですか?

4

1 に答える 1

2

これを行う公式の方法はないようであり、それは設計によるものと思われます。ストア (findレコードへのすべての要求がプロキシされる) は、指定された ID を記憶し、その ID が既に表示されている場合はサーバー呼び出しをスキップします。

ただし、コードを見ると、ルックアップの繰り返しを強制するためのいくつかのトリックがあるかもしれません。

1.IDで検索

ストアは、複雑な検索に使用するクエリを覚えていません。これらの検索をサポートするように Rails コントローラのインデックス アクションを微調整すると、次のように繰り返しクエリを実行できます。

fruit = App.Fruit.find({id: 'banana'});

これは検索であるため、実際には配列 (DS.AdapterPopulatedRecordArray正確には a ) が返されます。fruit.get('length')つまり、が より大きい場合に機能したことがわかります0。また、それを使用するには、配列から最初のレコードを取得する必要があることも意味します。

banana = fruit.objectAtContent(0);

これをサポートするには、Rails コントローラー アクションを次のようにする必要があります。

def index
  if params[:id]
    respond_with Fruit.find_all_by_id(params[:id])
  else
    # ...
  end
end

注意: Ember Data が期待するのは配列であることを確認してください。

2. 手動 GET、次にサイドロード

我慢できる場合は、サーバーに対して手動でリクエストを実行できます。サーバーがレコードで応答する場合は、JSON をストアにサイドロードできます。

store.load(App.Fruit, json)

これにより、メモリ内にあるそのレコードのインスタンスに属性が自動的に追加されます。

于 2012-11-17T17:14:47.410 に答える