Angularjs 如何获取$routeChangeSuccess上的实际当前控制器

Angularjs 如何获取$routeChangeSuccess上的实际当前控制器,angularjs,angularjs-service,angularjs-routing,angularjs-controller,Angularjs,Angularjs Service,Angularjs Routing,Angularjs Controller,我有一个全局routechangesuccess事件处理程序,用于在“页面加载”到我们的分析平台时跟踪路由更改 目前,我正在routechangesuccess处理程序中使用当前控制器名称来标识要发送到anlytics引擎的预定义变量集(例如:homeController->foo=1,galleryController->foo=2) 然而,我们也有一个控制器,它使用动态确定该值的逻辑 是否有任何方法可以从$routeChangeSuccess事件处理程序(而不仅仅是控制器名称)中访问实际的控

我有一个全局routechangesuccess事件处理程序,用于在“页面加载”到我们的分析平台时跟踪路由更改

目前,我正在routechangesuccess处理程序中使用当前控制器名称来标识要发送到anlytics引擎的预定义变量集(例如:homeController->foo=1,galleryController->foo=2)

然而,我们也有一个控制器,它使用动态确定该值的逻辑


是否有任何方法可以从$routeChangeSuccess事件处理程序(而不仅仅是控制器名称)中访问实际的控制器对象,以便我可以访问这些动态值?

您可能可以从将值附加到
状态
对象中获得一些好处。文件在这里描述了这一点:

例如,您可以在配置时按照他们指定的方式执行,也可以在
$stateChangeStart
期间动态添加

// Lives in your triggering controller
$rootScope.$on('$stateChangeStart', function(event, toState, toParams){
  toState.data.myVar = 'foo';
});

//... later that day

// Lives wherever you want.
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams){
  logToAnalytics(toState.name, toState.data);
});

如果您希望访问控制器的活动范围,我也遇到过类似的情况,每当路由发生更改时,我都需要获取当前加载的控制器的范围。我找到的解决方案是获取$viewContentLoaded事件的当前作用域。我有一个基本控制器,所有其他控制器都嵌套在其中,如下所示:

<body ng-controller="BaseCtrl">
    <!--Whatever views that get loaded through angular routing are in here-->
</body>
$scope.getAnalyticsValue = function() {
   ...
};
if ($scope.currentViewScope && $scope.currentViewScope.getAnalyticsValue) {
    var analyticsValue =  $scope.currentViewScope.getAnalyticsValue();
}
完成此操作后,您可以通过$scope.currentViewScope属性从基本控制器访问当前路由作用域上的任何作用域属性或函数。在您的情况下,如果特定于路由的控制器动态确定您希望在以下范围函数中使用的分析值:

<body ng-controller="BaseCtrl">
    <!--Whatever views that get loaded through angular routing are in here-->
</body>
$scope.getAnalyticsValue = function() {
   ...
};
if ($scope.currentViewScope && $scope.currentViewScope.getAnalyticsValue) {
    var analyticsValue =  $scope.currentViewScope.getAnalyticsValue();
}
然后,您将能够在基本控制器上获得该函数的结果,如下所示:

<body ng-controller="BaseCtrl">
    <!--Whatever views that get loaded through angular routing are in here-->
</body>
$scope.getAnalyticsValue = function() {
   ...
};
if ($scope.currentViewScope && $scope.currentViewScope.getAnalyticsValue) {
    var analyticsValue =  $scope.currentViewScope.getAnalyticsValue();
}
这里需要注意的是,您需要确保在加载视图内容之前不执行此操作


这肯定有点混乱,但它对我很有效,允许我从父作用域中的子作用域一致地访问作用域变量和方法。

您想要控制器实例吗?控制器构造函数?或者与该控制器关联的作用域?我猜它可能是控制器实例,或者控制器的活动作用域,它只需要是当前路由的实际实例。哦,您使用的是ye olde忠实香草路由器。我的错。首先,只需升级到:)迁移没有那么糟糕,嵌套状态是值得的。