我的模块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()
,我认为这将是实际运行的最后一件事,等待其他所有内容先加载。
答案 0 :(得分:1)
所以我的解决方案是获取模块上所有控制器的列表,并在每个模块的末尾广播一个“Loaded FooCtrl”事件。
我将控制器名称存储在rootScope的数组中,然后执行了sort()
和join()
并检查了与从类似于此方法收集的控制器匹配的字符串:
https://gist.github.com/Willshaw/6621360
如果2个字符串匹配,我知道所有控制器都已加载,我可以运行我的应用程序。