AngularJS延迟run()方法,直到控制器加载

时间:2013-09-19 09:16:43

标签: angularjs controller broadcast

我的模块run()方法检查用户是否已登录,然后决定加载哪个视图。 视图以CSS动画的形式滑入,但是当动画被触发时(通过 - classlist.add() - 我想播放一个事件并让控制器响应:

var myApp = angular.module('myApp', []);
run( function( $rootScope ) {

        $rootScope.loadView = function( view, animation ){ 
            // trigger the animation, which sends the $scope.$broadcast();
        }

        if(localStorage.loggedIn == 'false') {
            $rootScope.loadView( 'TutorialView' );
        } else {
            $rootScope.loadView(  'InterestView', 'slideUp');
        }
    }
);

myApp.controller('TutorialCtrl', ['$scope', function( $scope ){
    console.log('loaded');
    $scope.$on('TutorialViewCalled', function( event ) {
        console.log('tutorial class called');
    });         
}]);

在制作动画的服务中,我得到了这段代码:

console.log('the broadcast is: ' + targetClass+'Called');
$rootScope.$broadcast( targetClass + 'Called' );
console.log('broadcast the call');

我的console.log()输出如下所示:

the broadcast is: TutorialViewCalled
broadcast the call
loaded

因此,当loadView()中调用run()时,TutorialCtrl尚未加载。任何后续动画都没问题,我用视图中的按钮触发:

the broadcast is: InterestViewCalled
interest class called
broadcast the call
interest class loaded 

因此,在我的控制器准备就绪之前,run()方法似乎正在运行。我没有正确使用run(),我认为这将是实际运行的最后一件事,等待其他所有内容先加载。

1 个答案:

答案 0 :(得分:1)

所以我的解决方案是获取模块上所有控制器的列表,并在每个模块的末尾广播一个“Loaded FooCtrl”事件。

我将控制器名称存储在rootScope的数组中,然后执行了sort()join()并检查了与从类似于此方法收集的控制器匹配的字符串: https://gist.github.com/Willshaw/6621360

如果2个字符串匹配,我知道所有控制器都已加载,我可以运行我的应用程序。