javascript - 为什么我们需要在 dom 事件监听器中调用 $scope.$apply

标签 javascript angularjs

为什么当我点击update-time按钮时该值没有更新。

<html ng-app="domC">
    <head>
        <title>Angularjs DOM </title>
    </head>
    <body>       
        <div ng-controller="myController">
            {{data.time}}

            <br/>
            <button ng-click="updateTime()">update time - ng-click</button>
            <button id="updateTimeButton"  >update time</button>
        </div>
        <script src="lib/angular.js"></script>
        <script>
            var module = angular.module("domC", []);
            var myController1 = module.controller("myController", function($scope) {

                $scope.data = { time : new Date() };

                $scope.updateTime = function() {
                    $scope.data.time = new Date();
                }

                document.getElementById("updateTimeButton")
                        .addEventListener('click', function() {
                    console.log("update time clicked");
                    $scope.data.time = new Date();
                });
            });
        </script>
    </body>
</html>

下面这段代码似乎不会将 $scope.data.time 更新为 new Date();

document.getElementById("updateTimeButton")
     .addEventListener('click', function() {
      console.log("update time clicked");
      $scope.data.time = new Date();
});

对此我有两个问题

  1. 为什么我们需要在 dom 事件监听器中使用 $scope.$apply(function(){$scope.data.time}); 来更新值,为什么正常的方法行不通。
  2. 为什么不调用 $scope.$digest() 而不是 $scope.$apply() ,后者在内部再次调用 $scope.$digest 来迭代所有观察者。

最佳答案

1) 因为您需要通知 Angular 您的范围已更改。如果您使用ng-click,则不需要执行此操作,这会在内部为您执行此操作。

2)您没有理由调用摘要,正如您所说,apply 将在将您的更改应用到范围后调用它。强制摘要可能会在此时失败,并且可能会执行意外操作。

关于javascript - 为什么我们需要在 dom 事件监听器中调用 $scope.$apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27512111/

相关文章:

android - $http 调用不适用于 Ionic Android 构建

javascript - AngularJS - 覆盖管理布局?

javascript - 解析 - 未捕获的类型错误 : Cannot read property 'get' of undefined

javascript - `js` gtags.js 命令是什么?

javascript - React 中文本区域的换行符

javascript - AngularJS 过滤格式化日期

javascript - store.push 没有反射(reflect)在带有 ember-cli-pagination 的模板上

javascript - 为什么我的私有(private)变量被改变了?

javascript - 始终滚动到可滚动表的末尾

angularjs - 正确解码 Angular 1.4 $httpParamSerializer 查询字符串?