18

現在のコントローラーで以前のルーターを取得するにはどうすればよいですか。

App.MyController = Em.ObjectController.extend({
    next:function() { // This is my action helper in HBS
        this.transitionTo('nextPage');
    },
    back:function() { // This is my action helper in HBS
        // Here I need to dynamically identify my previous route.
        // How can I get my previous route.
    }
});
4

2 に答える 2

21

ルーター オブジェクトを再度調べたところ、最後のルートを取得できるプロパティが見つかりません。プレ4ではラストルート用の物件がありましたが、扱いが難しい物件でした。

したがって、私の解決策は 4 より前の場合と同じです。ナビゲートするルートを処理する独自の mixin を作成し、そのルートのリストから、現在のルートを取得できます。最後のものなど...

jsFiddle はこちら: http://jsfiddle.net/sMtNG/

混入します

最初にすべきことは、ルートを にプッシュできる mixin を作成することHistoryControllerです。setupControllerもちろん、ルートに移動するたびに呼び出されるメソッドを作成することで、これを行うことができます。

App.HistoryMixin = Ember.Mixin.create({
    setupController: function() {
        this.controllerFor('history').pushObject(this.get('routeName'));
    }
});

ルートを にプッシュしていHistoryControllerます。

ヒストリーコントローラー

routeName現在、存在しないに をプッシュしているのでHistoryController、先に進んでそれを作成する必要がありますが、これはまったく特別なことではありません。

App.HistoryController = Ember.ArrayController.extend();

インデックス コントローラー

はナビゲートしたルートのリストを格納するためHistoryController、 などの他のコントローラーでアクセスできる必要があります。したがって、どのコントローラーでアクセスできるかを指定するためにIndexController使用します。needs

App.ApplicationController = Ember.Controller.extend({
    needs: ['history']    
});

Mixin を実装する

これで、ルートを追跡するために必要なものがすべて揃ったので、ルートがこの mixin を実装する必要があることを指定します。

App.CatRoute = Ember.Route.extend(App.HistoryMixin);

テンプレート

最後になりましたが、HistoryControllerアクセスIndexControllerできる があり、ミックスインがアクセスした各ルートを にプッシュしたHistoryControllerので、アプリケーション ビューを使用してルートのリストを出力し、最後のルートを指定できます。もちろん、あなたの場合、最後のルートから1を引いたものが必要になりますが、私がすべてを行う意味はありません!

<h1>Routes History ({{controllers.history.length}})</h1>
<ul>
    <li>Last Route: {{controllers.history.lastObject}}</li>
    {{#each controllers.history}}
        <li>{{this}}</li>
    {{/each}}
</ul>

これで真っ直ぐで狭い道にたどり着けることを願っています。

于 2013-02-21T17:15:36.670 に答える