$digest不久之后$watch定义触发“$apply已经在进行中.“错误
$digest soon after $watch definition triggers "$apply already in progress..." error
>我是一个棱角分明的菜鸟,我试图理解为什么以下触发"$apply已经在进行中......" 错误。
这是代码(它实际上几乎直接来自文档:https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$digest)
<!DOCTYPE html>
<html>
<head>
<script src="js/lib/angular.js"></script>
<script>
var app = angular.module('app', []);
app.controller('MainController', ['$scope', function(scope) {
scope.name = 'misko';
scope.counter = 0;
//A
scope.$watch('name', function(newValue, oldValue) {
scope.count++;
});
//B
scope.$digest();
}]);
</script>
</head>
<body>
<div ng-app='app' ng-controller="MainController">
</div>
</body>
</html>
而且,这是小提琴:https://jsfiddle.net/zLny2faq/5/
我收到著名的"$apply已经在进行中"错误,但为什么呢?
我想知道为什么摘要周期甚至没有被调用就触发?
换句话说,我只是声明监视侦听器 (@comment A) 并通过调用 $digest() (@comment B) 来触发它们。但是当我显式调用 $digest() 时,似乎它以某种方式被更快地调用并出错。为什么会这样?
请指教。
name 变量在监视 yes 之前设置,但所有监视在初始化时都会调用一次:
每个角度文档
将观察程序注册到作用域后,侦听器 fn 为 异步调用(通过 $evalAsync)以初始化观察程序。在 在极少数情况下,这是不可取的,因为侦听器是在以下情况下调用的 watchExpression 的结果没有改变。检测此方案 在侦听器 fn 中,您可以比较 newVal 和 oldVal。如果 这两个值是相同的 (===),然后侦听器被调用 due 到初始化。
^ 可以通过以下方式照顾:
$scope.$watch('name', function(newValue, oldValue) {
if (newValue !== oldValue) {
// will only run if the value changes, on initial load the newvalue = oldvalue so it won't run this code.
}
});
如果确实需要调用$digest,可以使用
$timeout(function(){
scope.$digest();
}, 0);
小提琴
相关文章:
- 类型错误:无法读取未定义的属性“apply”,在测试中使用 javascript apply
- 未捕获的类型错误:hook.apply不是在react路由器中使用onEnter时的函数
- Firefox”;坏的NPObject”;仅当使用Function.apply()时,swf出现错误
- 棱角分明的谷歌地图标记和$scope$apply();错误
- 类型错误: $scope.apply 不是一个函数
- Function.prototype.apply:参数列表的类型错误
- $digest不久之后$watch定义触发“$apply已经在进行中.“错误
- [function].apply() 导致 IE 中出现“JScript 对象预期”错误
- 主干中的下划线 .defer() 导致错误:无法调用未定义的方法“apply”
- AngularJS:你能得到一个'正在进行的摘要'来自多个$scope的错误$apply()调用
- 为什么是$scope$这里需要apply()来进行简单的删除,以及'这是推荐的方法(因为有了它,就会抛出一个错误
- Chrome:如何解决Math.max.apply(Math,数组)上的“超出最大调用堆栈大小”错误
- Angularfire-$scope在异步调用后不会更新,$apply抛出错误
- 调用$scope时发生Angularjs错误$apply()
- 角度变量未更新,尝试调用$apply导致“;摘要已经在进行中”;错误
- 未捕获的类型错误:callback.apply不是函数
- $Scope.$Apply()在加载数据到Angular-Ui-Grid后返回一个圆形错误
- 类型错误:非法调用console.log.apply
- 美元的范围.$apply返回错误
- function .prototype.apply给我留下undefined不是一个函数错误