8

私のルートには、サーバーにモデルのリストを要求しようとするメソッドがあります

 model: ->
    App.MyModel.find
      projectId: (@modelFor "project").id

明らかに時々これは404を返すかもしれません。

これが発生した瞬間、Emberは何もしなくなります。ビューはレンダリングされず、コントローラーはセットアップされません。

では、どうすれば404を適切に処理できますか(つまり、エラービューを表示できますか)?

4

3 に答える 3

4

悪いニュース: 現在、ember-data は find() で 404 を取得しても何もしません。まったく。モデルは永久に「読み込み中」状態になります。

私の意見では、ここには完全に愚かではないオプションはありません。おそらく最後の手段としてnotFound、DS.Model に属性を追加し、404 を返す代わりに、JSON を にnotFound設定して返しますtrue。痛いですよね、わかります…

--- 私は元々find、 のサブクラスでオーバーライドするソリューションを提供していましたRESTAdapterfind次に、ロードされていると思われるレコードインスタンスが渡されないことに気付きました。したがって、レコードをエラー状態にして 404 を処理する必要はありません。

[注: ember-data は 2013 年 3 月以降大幅に変更されたため、この回答の情報は有効でなくなる可能性があります]

于 2013-03-23T02:15:48.217 に答える
0

ちなみに、「新しい」BasicAdapter がリリースされたばかりです。私にとっての質問は、これにより 404 エラーの処理が容易になるかということでした。

アプローチ #1

私の最初のアプローチは、クリストファーが提案していたものと同様に、HTTP ステータスを含むフィールドを追加することでした。

  status: DS.attr("number");

そして、次の AJAX 呼び出しを使用しました。

$.getJSON(url, data).then(null, function(xhr) {
  return {
    id: id,
    statusCode: xhr.status
  };
}).always(function(data) {
  return process(data).load();
});

これが行うことは、エラー応答 (xhr) を、要求された ID とステータス コードを含むハッシュに変換することです。最後に、成功した結果または失敗したハッシュがストアに渡されます。

この種の方法は機能しますが、あまり実用的ではありません。すべてのモデル インスタンスのリストを表示する場合、それらの「モック」インスタンスを手動で除外する必要があります。


アプローチ #2

もう 1 つのアイデアは、特別なエラー モデルを作成することでした。

App.Error = App.Model.extend({
  status: DS.attr("number")
});

そしてそれに応じたクエリ:

$.getJSON(url, data).then(null, function(xhr) {
  return App.store.load(App.Error, {}, {
    id: 0,
    status: xhr.status
  });
}).done(function(data) {
  return process(data).load();
});

これにより、エラー モデルの新しいインスタンスが読み込まれて作成され、ストアに配置されます。

これの問題は、Ember がこれを実際に「受け入れ」ていなかったことです。アプリケーションはルーティングを停止し、何もしなくなりました。したがって、これも行き止まりのようです:(

于 2013-03-23T17:01:24.763 に答える