1

我的模块 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()不当,我认为这将是实际运行的最后一件事,等待首先加载其他所有内容。

4

1 回答 1

1

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

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

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

于 2013-10-22T13:16:26.593 回答