我有一个全局的routechangesuccess事件处理程序,用于跟踪路由更改,因为" Page Loads"到我们的分析平台。
目前,我正在使用routechangesuccess处理程序中的当前控制器名来识别要发送到anlytics引擎的预定义变量集(例如:homeController - > foo = 1,galleryController - > foo = 2)
但是,我们还有一个控制器,它使用逻辑来动态地确定这个值。
有没有办法从$ routeChangeSuccess事件处理程序(而不仅仅是控制器名称)访问实际的控制器对象,所以我可以访问这些动态值?
答案 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();
}
这里需要注意的是,您需要确保在加载视图内容之前不要这样做。
它确实有点混乱,但它对我有用,并允许我从父范围内的子范围始终访问范围变量和方法。