2

以下のようなfindメソッドを使用していくつかのコードを書きました。アダプターは RESTAdapter です。

App.SessionManager = Em.Object.extend({
  userIdChanged: function() {
    App.User.find(this.get('userid')).then(
      function(user) {
        /* process something */
      },
      function(error) {
        /* rejection handler */
        /* I want to know what error returned by the server here.*/
        /* but how? */
      }
    );
  }.observes('userid'),
});

サーバーが何らかのエラー (401 など) を返した場合、拒否ハンドラーが呼び出されました。しかし、ハンドラの引数にはエラー情報がないようです。拒否ハンドラでエラーの理由を知るにはどうすればよいですか?

4

2 に答える 2

2

サーバーから返されたエラーの処理は、ember データではまだ完全には実装されていません。参考までに、ember-data に関するこのブログ投稿に記載されているように:

エラー処理と、クライアントとサーバーの競合への対処を確実なものにしたいと考えています。Paul Chavard からのプル リクエストが現在開かれており、エラー処理の確実な出発点のようです。近い将来、これに関するさらに多くの開発が見られるはずです。

ただし、その間にその情報を取得するために実行できる回避策がいくつかあります。

例えば:

Ember.RSVP.configure('onerror', function(error) {
  console.log(error.message);
  console.log(error.stack);
});

または、汚いハックを使用してその情報を取得します。ember-data は内部で jQuery を使用するため、以下にサブスクライブできますajaxError

$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
  // this will trigger anytime there is an error
});

それが役に立てば幸い。

于 2013-08-27T07:41:10.470 に答える
0

これをオーバーライドすることもできます:

becameInvalid: function(record) {
  // you can get errors just by doing record.errors, error keys must match
  // the name of a field that you have defined in your model
}

と:

becameError: function(record) {
}

これは、サーバーでエラーの原因となった何かが発生した場合です。Promise のエラーを処理したいことがわかりましたが、それは私が扱っていない別のものです。becomeError が発生する可能性があります。

アップデート:

新しいルーターのおかげでEmber-Data が 401 を処理しています。これらの新機能をすべて使用する機会はありませんでしたが、かなりクールに見えます。

于 2013-08-27T14:49:29.623 に答える