Angular:在$ on events中设置变量,需要调用$ apply吗?

时间:2016-09-07 15:52:23

标签: angularjs angularjs-scope

我正在使用角度模块然后发送消息,我试图将变量设置为true或false但我注意到它们不会在UI中更新,除非我将它们包装在$ apply中。这是最好的方法。

这是我的工作代码,删除$ apply,尽管变量已更新 - 视图永远不会更新。

  $scope.$on('duScrollspy:becameActive', ($event, $element, $target) => {
        $scope.$apply(() => {
          this.ready = true;
        });
    });

任何想法最好的方法来解决这个问题?调用$ apply看起来像代码味道,我知道听取范围上的事件并不被认为是好的做法,但这是第3部分角度模块。

由于

2 个答案:

答案 0 :(得分:1)

修改事件内的范围需要调用$ apply()。 (this绑定到范围btw)

没有办法绕过它。 (如果您需要更新视图。)

$apply实际上是在许多地方自动调用的,例如$ http promise resolve code(https://github.com/angular/angular.js/blob/master/src/ng/http.js第1331-1351行),但事件没有被调用。

注意,行号可能会改变。搜索function done()

所以这不是代码味道,这是标准的。

答案 1 :(得分:0)

您的问题可能是this关键字。重要的是要记住this根据使用它的上下文改变它的含义。您可能认为this指的是您的控制器,服务或您在其中定义了您的监听器的任何对象。这就是为什么你会看到这种将控制器命名为第一种语句的常见模式:

function MyController($scope, $rootScope) {
  var vm = this;

  $scope.$on('duScrollspy:becameActive', ($event, $element, $target) => {
    vm.ready = true;
    // or 
    $scope.ready = true
    // is better than
    this.ready = true;
  });
}