【问题标题】:AngularJS- why am I needing $scope.$apply within $scope.$on?AngularJS-为什么我需要在 $scope.$on 内使用 $scope.$apply?
【发布时间】:2014-03-15 13:45:01
【问题描述】:

我有一些不符合预期的代码...我在 AngularJS 控制器中有一个事件监听器,如下所示:

$scope.$on("newClipSelected", function(e) {
    $scope.$apply(function() {
        $scope.isReady = true;
    });
});

控制器的标记有一个 ng-show='isReady'。当此事件处理程序运行时,ng-show 区域按预期显示。但是,此事件处理程序不起作用:

$scope.$on("newClipSelected", function(e) {
    $scope.isReady = true;
});

使用此事件处理程序,如果我使用调试器期待 AngularJS 范围,我确实看到 $scope.isReady=true,但是 ng-show 元素没有显示。

据我了解,$scope.$on 实际上会酌情调用 $watch/$apply。那么为什么在这种情况下我需要调用 $apply 呢?

该事件是由在非 angularJS 异步完成事件中调用 $rootScope.$broadcast() 触发的。

【问题讨论】:

    标签: angularjs angularjs-scope


    【解决方案1】:

    不,Angular 不会在事件中触发 $apply,因此如果在 Angular 的上下文之外调用 $broadcast,您将需要手动 $apply

    查看来源here

    【讨论】:

    • 在这种情况下,$scope.$apply 应该放在广播事件的非 Angular 代码(而不是事件侦听器)周围,以便只执行一个摘要循环。
    • 谢谢。我想链接一个论坛帖子,我在其中稍微扩展了我的场景:groups.google.com/d/topic/angular/xaZcuKB7IlA/discussion。我相信您的回答是正确的,但我不确定在进行广播时我应该 $apply 哪个 $scope(如论坛帖子中所述)。
    【解决方案2】:

    $on$broadcast 不会为您调用$apply,您需要自己调用它。我不确定为什么会这样,但我的猜测是,这是因为摘要有点贵,而且为每个事件运行摘要周期会产生成本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多