私は最近、私が維持している多くの Ember アプリを RC 8 に移植しており、これに遭遇しました。
ルーターの改造が行われる前は、Ember Datafind
呼び出しによって返される promise を介して制御フローを管理することがありました。
例えば:
SomeRoute = Ember.Route.extend({
model: function(params) {
var resolve = function(model) { return model; };
var route = this;
var reject = function() { this.transitionTo('someOtherRoute'); };
return SomeModel.find(params.some_model_id).then(resolve, reject);
}
...
});
最近の変更により、error
アクションを介してモデル コールバックで作成されたエラーを処理できるようになりました。
SomeRoute = Ember.Route.extend({
// note: model callback no longer needed--default suffices
actions: {
error: function(reason, transition) {
// check the reason object to determine how/if to handle this error
this.transitionTo('someOtherRoute');
}
}
...
});
コードが読みやすくなり、懸念事項がより適切に分離されるため、私は後者のアプローチを非常に好みます。
これはほとんどの場合うまく機能しますが、ネストされたルートを使用するアプリで問題が発生しました。問題を示す jsbin に続いて、簡単な例を含めました。
Article
に属する を表示したいとしましょうAuthor
。URL は次のようになります/authors/:author_slug/articles/:article_slug
。誰かが存在しない記事を表示しようとしたときに、Not Found ページにリダイレクトしたいと考えています。
model
上記のようにコールバックで制御フローを管理すると、期待どおりに参照し/authors/some_author/articles/some_invalid_slug
てリダイレクトすることができます/authors/some_author/articles/not_found
。
ただし、Not Found ページへのリダイレクトが代わりにerror
アクションによって管理されている場合、親コンテキストはある時点で失われ、/authors/undefined/articles/not_found
.
これは、次の jsbin で確認できます。
http://jsbin.com/eJOXifo/1#/authors/schneier/articles/12345 ( http://jsbin.com/eJOXifo/1#/authors/schneier/articles/not_found にリダイレクト)
http://jsbin.com/oNaWelo/1#/authors/schneier/articles/12345 ( http://jsbin.com/oNaWelo/1#/authors/undefined/articles/not_found にリダイレクト)
なぜこれが起こるのか、またはそれを回避する方法を知っている人はいますか?
ノート:
- これが Ember Data とは何の関係もないことはわかっています。ただし、Ember Data を使用せずに同等のものを実装すると、何も追加せずに例がより複雑になります。
- Ember Data を jsbin で期待どおりに動作させるための小さなハックがいくつかあります。
- どこからでもロードする必要がないように、親モデルをプリロードしています。
- 子モデルにデータを提供するために特別なことは何もしていません。アプリは にリクエストを送信するだけ
http://jsbin.com/articles/12345
です。これは実際には 200 を返しますが、応答が html であるためとにかく爆撃します。404 応答を正しく返す API は、同じ動作をします。 - 少し前に、jsfiddle や jsbin などのサービスで使用する偽の API 応答を作成するために使用できるサービスについて読んだことを覚えています。それが何なのか知っている人はコメントしてください。