什么是"更便宜"的表现明智的广播或$ watch

Ole*_*sov 42 angularjs

我的应用程序中有一种情况,每次用户角色发生变化时我都需要重新加载菜单(一个用户可以在多家公司中担任角色).

我想知道解决这个问题的最佳方法是什么.

目前我正在做以下事情:

app.controller('menuLoadingCtrl', function($location, $scope, authService){
    $scope.model.initialRole = authService.getRole();
    $scope.$watch(function(){return authService.getRole()}, function(val){
        if(val && val != $scope.model.initialRole){
                $scope.layout.menuSrc = 'partials/menu.html';
        }
    });
})
Run Code Online (Sandbox Code Playgroud)

简单地将用户重定向到菜单加载视图,并从那里,一旦角色完成加载,返回到菜单视图.我把它包裹在一个函数中:

 $scope.layout.reloadMenu = function(){
        $scope.layout.menuSrc = 'partials/menuLoading.html';
    }
Run Code Online (Sandbox Code Playgroud)

我想在任何我想重新加载菜单的场景中调用它.

我想知道我是否可以通过从$ rootScope上的服务广播此事件,然后在控制器中监听它来使这个过程更加自动化.

任何想法\建议将非常感谢.

Bla*_*ole 53

$watch()正在进行污垢检查:该功能对每个摘要周期进行比较.另一方面,$broadcast()仅在有事件时传播事件.当然,$broadcast()比便宜$watch().

但你真的不得不担心这里的表现吗?循环的一个原始比较是没有的.但是,从概念上讲,$watch()显然您需要的是:每次变量发生变化时,您都希望执行操作.我无法想象$broadcast()在这里使用.

  • 你是对的.[这个测试让我信服.](http://jsperf.com/angular-broadcast-vs-watch) (7认同)
  • +1清晰简洁.我想补充一点,OP的代码首先不应该在控制器中有`$ watch`或`$ broadcast` - 而OP应该在Angular服务中包装`authService`或者更好,`$ q`诺言. (5认同)