【问题标题】:AngularJS delay run() method until controllers loadedAngularJS 延迟 run() 方法直到控制器加载
【发布时间】:2013-09-19 09:16:43
【问题描述】:

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

【问题讨论】:

    标签: angularjs controller broadcast


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 2014-09-25
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多