簡體   English   中英

如何在$ routeChangeSuccess上獲取實際的當前控制器

[英]How to get the actual current controller on $routeChangeSuccess

我有一個全局routechangesuccess事件處理程序,用於將路由更改作為“頁面加載”跟蹤到我們的分析平台。

當前,我在routechangesuccess處理程序中使用當前控制器名稱來標識一組預定義的變量,以發送給解析引擎(例如:homeController-> foo = 1,galleryController-> foo = 2)。

但是,我們還有一個控制器,該控制器使用邏輯來動態確定該值。

有什么方法可以從$ routeChangeSuccess事件處理程序中訪問實際的控制器對象(而不只是控制器名稱),因此我可以訪問這些動態值?

您可能可以通過將值附加到state對象上獲得一些里程。 文檔在這里描述:

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

您可以在配置時$stateChangeStart指定的方式進行操作,也可以在$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.$on('$viewContentLoaded', function(event) {
    $scope.currentViewScope = event.targetScope;
});

完成此操作后,您可以通過$ scope.currentViewScope屬性從基本控制器訪問當前路由范圍內的任何范圍屬性或函數。 在您的情況下,如果特定於路由的控制器在像這樣的作用域函數中動態確定所需的分析值:

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

然后,您將可以在基本控制器上獲得該函數的結果,如下所示:

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

需要注意的是,您需要確保在加載視圖內容之后才執行此操作。

肯定有點混亂,但是它對我有用,並允許我從父作用域的子作用域中一致地訪問作用域變量和方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM