【问题标题】:What is 'cheaper' performance-wise $broadcast or $watch什么是“更便宜”的性能明智的 $broadcast 或 $watch
【发布时间】:2013-11-06 03:31:00
【问题描述】:

我的应用程序中存在每次用户角色更改时都需要重新加载菜单的情况(一个用户可以在多个公司担任角色)。

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

目前我正在做以下事情:

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';
        }
    });
})

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

 $scope.layout.reloadMenu = function(){
        $scope.layout.menuSrc = 'partials/menuLoading.html';
    }

在我想重新加载菜单的任何情况下都会调用它。

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

对此的任何想法\建议将不胜感激。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

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

    但是您真的需要担心这里的性能吗?一个原始的循环比较什么都不是。但是,从概念上讲,$watch() 显然是您需要的:您希望每次变量更改时都执行一个操作。我无法想象在这里使用$broadcast()

    【讨论】:

    • +1 简洁明了。我只想补充一点,OP 的代码首先不应该在控制器中包含 $watch$broadcast - 而是 OP 应该将 authService 包装在 Angular 服务中,或者更好的是 $q 承诺。
    • 感谢您的及时答复。我想这是正确的路径,唯一的问题是这样我每次想重新加载菜单时都需要调用某个函数,这会导致大量代码,因此需要更多的维护。对服务级别进行脏检查并广播一个事件将使此操作自动执行,但是在对服务器的请求解析时将不允许我显示加载程序。
    • 另外我需要为控制器设置一个标志,用于我同步设置角色类型的情况,例如登录\注销。
    • 你是对的。 This test convinced me.
    • @vianney:除了明显变慢之外,对我来说,手表测试在迭代 9 或 10 时会使选项卡崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2011-07-03
    • 2011-04-13
    相关资源
    最近更新 更多