2015-02-24 88 views
1

$ viewcontentloaded上的方法異步觸發。爲了詳細說明我的問題,我在根作用域中有一個變量,即我的主控制器,在我的視圖控制器加載之前需要對其進行初始化。在module.run我在調用同步函數來初始化$ rootScope.session。在我看來,一個路由的控制,我檢查會話的機能缺失的狀態被稱爲像

$scope.$on('$viewContentLoaded', function() { 
      $scope.initialize(); 
     }); 

但在頁面refreash有些時候,我正在爲$ rootScope.session一個未定義的值,因爲它可能在稍後進行了初始化。那麼,有沒有什麼辦法讓像這樣同步的rootcope在視圖加載前被初始化。對於好奇心,如果我調用$ scope.initialize(),它將如何影響?通常在我的控制器中,在$ viewContentLoaded或$ routeChangeSuccess中。 在此先感謝。

+0

經過大量的挖掘,沒有得到正確的理由,我已經解決了在函數中添加$ timeout。 – 2015-02-25 10:00:41

回答

0

那麼,有沒有什麼辦法讓這個同步像rootcope將在視圖加載之前初始化。

使用$controller服務手動創建控制器,如在單元測試中。

$controllerProvider.register('FooCtrl', FooCtrl); 
    ctrl = $controller('FooCtrl', {$scope: scope}); 

或者$broadcast從主控制器自定義事件下至小孩:

function mainCtrl($rootScope) 
    { 
    $rootScope.$broadcast('abc'); 
    } 

    function secondCtrl($scope) 
    { 
    $scope.$on('abc', function(event) { $scope.initialize(); }); 
    } 

或者使用try/catch block和一個帶有計時器的遞歸調用。

這些或多或少都是您在AngularJS中實現延遲加載所需的步驟。總之,您首先要定義您的應用程序模塊以保留相關提供程序的實例。然後,您將定義您的懶惰工件以使用提供程序而不是模塊API註冊自己。然後使用在您的路由定義中返回承諾的'resolve'函數,您將加載所有延遲工件,並在加載完成後解析承諾。這可確保所有惰性工件在相關路由呈現之前可用。此外,不要忘記解決$ rootScope中的承諾。$ apply,如果分辨率將在AngularJS之外發生。然後,您將創建一個'引導'腳本,在引導應用程序之前首先加載應用程序模塊。最後,您將鏈接到'index.html'文件中的引導腳本。

參考

相關問題