gpt4 book ai didi

AngularJS - 为什么 $scope.$apply 会影响其他范围

转载 作者:行者123 更新时间:2023-12-01 23:33:14 25 4
gpt4 key购买 nike

在我的 AngularJS 应用程序中,我有 2 个未嵌套的 Controller 。调用 $scope.$apply 方法似乎也会影响其他同级作用域。

jsfiddle下面,似乎每当 ControllerTwo 每秒更新一次时钟时,就会评估 ControllerOne 的 {{doubleMe(x)}} 表达式。这可以从控制台消息中显示。

我能理解为什么每当文本输入(在同一范围内)发生变化时都会对该表达式求值,但为什么 $scope.$apply 在另一个范围内也会导致该表达式被重新求值?

请注意,我本可以通过使用 $timeout 来避免 $scope.$apply,但结果会被观察到。

    <!-- HTML file -->
<div ng-app>
<h1>Root</h1>
<div ng-controller="ControllerOne">
<h2>Scope One</h2>
1 * 2 = {{doubleMe(1)}}<br/>
2 * 2 = {{doubleMe(2)}}<br/>
3 * 2 = {{doubleMe(3)}}<br/>
<input ng-model="text">
</div>

<div ng-controller="ControllerTwo">
<h2>Scope Two</h2>
{{clock.now | date:'yyyy-MM-dd HH:mm:ss'}}
</div>
</div>

//js文件

    function ControllerOne($scope) {
var counter=1;
$scope.doubleMe = function(input) {
console.log(counter++);
return input*2;
}
$scope.text = "Change Me";
}

function ControllerTwo($scope) {
$scope.clock = {
now: new Date()
};

var updateClock = function() {
$scope.clock.now = new Date()
};

setInterval(function() {
$scope.$apply(updateClock);
}, 1000);
}

最佳答案

如您所见,$scope.$apply = $rootScope.$digest//+ 一些错误处理 并且因为 $scope.$apply 使用 $rootScope 它会影响它的所有后代。

所以如果你更新一个子作用域,你可以调用 $scope.$digest 只对那个作用域及其后代进行脏检查,结果你减少了脏检查的次数并增加了你的表现。

示例

我更改了您的代码并添加了 $digest。

setInterval(function() {
$scope.clock.now = new Date();
$scope.$digest();
}, 1000);

实例: http://jsfiddle.net/choroshin/JY5sb/4/

关于AngularJS - 为什么 $scope.$apply 会影响其他范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21424319/

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