1

私は最近、私が維持している多くの 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 応答を作成するために使用できるサービスについて読んだことを覚えています。それが何なのか知っている人はコメントしてください。
4

1 に答える 1

1

親コンテキストが失われているというあなたの権利。トリックは、遷移からそのコンテキストを抽出し、呼び出し時に引数として渡すことtransitionToです。そう:

App.ArticlesArticleRoute = Em.Route.extend({
  actions: {
    error: function(reason, transition) {
      console.log('in error handler');
      this.transitionTo('articles.notFound', transition.resolvedModels.authors);
    }
  }
});

この変更により、次の URL にアクセスします。

http://jsbin.com/iVOYEvA/2#/authors/schneier/articles/my-fake-article

リダイレクト先:

http://jsbin.com/iVOYEvA/2#/authors/schneier/articles/not_found

于 2013-08-31T07:07:32.947 に答える