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/

米信

首先要做的是创建允许我们将路由推送到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访问的路由,并且 mixin 将每个访问的路由推送到 中HistoryController,我们可以使用应用程序视图输出路由列表,并指定最后一个路由。当然,在您的情况下,您将需要最后一条路线减一,但是我做所有事情都没有意义!

<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 回答
0

当前的解决方案感觉就像是在摇尾巴。

简单的解决方案是window.history.back()

Ember 不跟踪路由器历史记录,因为它是多余的。默认情况下,所有浏览器都已处理此问题。

于 2018-04-02T16:49:50.833 回答