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

时间:2014-06-20 17:58:03

标签: angularjs angularjs-service angularjs-routing angularjs-controller

我有一个全局的routechangesuccess事件处理程序,用于跟踪路由更改,因为" Page Loads"到我们的分析平台。

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

但是,我们还有一个控制器,它使用逻辑来动态地确定这个值。

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

2 个答案:

答案 0 :(得分:0)

您可以从state对象的值上获得一些里程数。文档在这里描述:

https://github.com/angular-ui/ui-router/wiki#attach-custom-data-to-state-objects

您可以在配置时指定,也可以在$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);
});

答案 1 :(得分:0)

如果您正在寻找访问控制器的活动范围,我遇到类似的情况,我需要在路由更改时获取当前加载的控制器的范围。我找到的解决方案是获取$ viewContentLoaded事件的当前范围。我有一个基本控制器,所有其他控制器都嵌套在这样:

<body ng-controller="BaseCtrl">
    <!--Whatever views that get loaded through angular routing are in here-->
</body>

在基本控制器中,我设置当前视图的范围如下:

$scope.$on('$viewContentLoaded', function(event) {
    $scope.currentViewScope = event.targetScope;
});

完成此操作后,您可以从基本控制器通过$ scope.currentViewScope属性访问当前路由范围内的任何作用域属性或函数。在您的情况下,如果路径特定控制器在范围函数中动态确定您想要的分析值,如下所示:

$scope.getAnalyticsValue = function() {
   ...
};

然后您就可以在基本控制器上获得该功能的结果,如下所示:

if ($scope.currentViewScope && $scope.currentViewScope.getAnalyticsValue) {
    var analyticsValue =  $scope.currentViewScope.getAnalyticsValue();
}

这里需要注意的是,您需要确保在加载视图内容之前不要这样做。

它确实有点混乱,但它对我有用,并允许我从父范围内的子范围始终访问范围变量和方法。