gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:12:29 27 4
gpt4 key购买 nike

为什么当我点击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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com