【问题标题】:How to get the actual current controller on $routeChangeSuccess如何在 $routeChangeSuccess 上获取实际的当前控制器
【发布时间】:2014-08-11 13:19:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您想要控制器实例?控制器构造函数?还是与该控制器关联的范围?
  • 我猜它可能是控制器实例,也可能是控制器的活动范围,它只需要是当前路由的实际实例。

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


【解决方案1】:

如果您要访问控制器的活动范围,我遇到了类似的情况,每当路由更改时,我都需要获取当前加载的控制器的范围。我找到的解决方案是获取 $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();
}

这里需要注意的是,您需要确保在加载视图内容之前不要执行此操作。

这肯定有点乱,但它对我有用,并允许我从父作用域内的子作用域持续访问作用域变量和方法。

【讨论】:

    【解决方案2】:

    您可能可以通过将值附加到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);
    });
    

    【讨论】:

    • 哦,您使用的是 ye-olde-faithful vanilla 路由器。我的错。 Prolly 只需升级到ui-router :) 迁移还不错,嵌套状态是值得的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多