AngularJS - 在触发控制器时获取以前的路线

时间:2014-05-27 12:53:24

标签: angularjs routes

Angular的内部结构让我感到困惑。

我需要确定加载特定视图时的上一个路线。

我就是这样做的

app.controller('TrashCtrl',function($scope,$rootScope){

    $rootScope.$on('$locationChangeSuccess',function(evt, absNewUrl, absOldUrl) {

        var hashIndex = absOldUrl.indexOf('#');

        var oldRoute = absOldUrl.substr(hashIndex + 2);

        console.log(oldRoute);

    });

});

不幸的是,在逻辑开始工作之前,我必须调用与该控制器对应的视图一次。控制器第一次触发时,不记录任何内容。此外,在此初始加载后,应用程序将记录每个 routeChange,即使加载的视图不适用于TrashCtrl

我想这样:

  • 当加载视图Trash(其控制器为TrashCtrl)时,我需要先前的路径或空字符串(如果这是第一个)。
  • 如果仅在调用实际trash路由时触发,而不是在每个路径更改时触发,那将是很好的。

如何实现这一目标?

编辑:

请注意,我知道可以创建自定义服务并将每个更改写入其中。这不是我想要的。我想仅在需要时才计算数据,例如只在调用Trash时。

2 个答案:

答案 0 :(得分:7)

我尽我所能,但似乎没有直接的方法可以访问 $routeProvider resolve属性中的上一条路径。

为了好玩,我使用以下属性实现了一个(荒谬复杂的)解决方案:

  • 仅在加载/trash视图时才检测到上一个路径(不是每个路径都有)。
  • 它不需要了解其余路线。
  • 添加其他路由时无需额外配置(这会增加实施复杂性,但会简化维护)。

用文字

以下是“简单”字样的工作原理:

resolve对象中,它会为下一个$routeChangeSuccess事件注册一个侦听器 捕获事件后,它会取消注册监听器 一旦侦听器未注册,它就会解析具有前一路径路径值的promise。 注入trashCtrl(来自resolve属性)的对象是一个函数,它返回上述承诺。
控制器接收该函数,调用它来获取承诺,并等待承诺通过前一个路径的路径得到解决。

简单就像馅饼一样!

<子> 注意: 为了“简单”,我没有考虑导致$routeChangeError(而不是$routeChangeSuccess)的错误的可能性。人们应该考虑到这一点并取消注册听众,但即使你不这样做,也不会有任何伤害 - 听众会在$routeChangeSuccess被解雇一次之前离开。


代码

控制器:

app.controller('trashCtrl', function ($scope, prevRoutePromiseGetter) {
    prevRoutePromiseGetter().then(function (prevRoute) {
        $scope.prevRoute = prevRoute || 'nowhere';
    });
});

resolve对象:

resolve: {
    prevRoutePromiseGetter: function ($q, $rootScope) {
        var deferred = $q.defer();
        var dereg = $rootScope.$on('$routeChangeSuccess', 
            function(evt, next, prev) {
                dereg();
                deferred.resolve((prev.originalPath || '').substr(1));
            }
        );
        return function () {
            return deferred.promise;
        };
    }
}

另请参阅此 short demo

答案 1 :(得分:-1)

您需要使用$ routeChangeStart而不是位置更改。

$rootScope.$on('$routeChangeStart', function(event, next, current) {

});