如果表达式与self.display
匹配,我会将true
的值更改为regex
。我已在$scope.$apply()
块中编写此逻辑,但在触发Digest already in progress
块时出现if
错误。
部分视图模板 -
<form ng-controller="termsCtrl as terms">
<div ng-show="terms.display">
<input type="checkbox">
<label> Accept </label>
</div>
</form>
控制器 -
if (self.regex.test(self.current)) {
$scope.$apply(function() {
self.display = true;
});
} else {
self.display = false;
}
以上代码有效。当div
为真时,它会在form
内正确显示self.display
,但我收到$digest already in progress
错误。
到目前为止,我已尝试过以下内容,
1)
$scope.$watch('self.display', function() {
console.debug(self.display);
})
2)
if(!$scope.$$phase) {
$scope.$apply();
}
3)
$timeout(function(){
self.display = true;
});
上述技术不会产生任何错误,但div
中的form
永远不会显示。
答案 0 :(得分:0)
当您在角度控制器的范围外执行时,您只需要使用$ scope。$ apply()。例如,如果您使用JQuery或普通javascript事件来触发回调,则应在该回调中使用$ apply()。
没有看到你的所有代码,很难说出问题是什么,但我最初的想法是你应该使用$ scope.display而不是“self.display”
答案 1 :(得分:0)
如果您使用的是指令,则需要使用bindToController
选项,以便angular监视控制器实例上的值。否则,如果您只是使用普通控制器并且只想使用controllerAs
语法,则必须手动设置监视:
<强>的JavaScript 强>
angular.module("app", [])
.controller('termsCtrl', function ($scope) {
this.display = true;
$scope.$watch(angular.bind(this, function () {
return this.display;
}), function (newVal, oldVal) {
// now we will pickup changes to newVal and oldVal
if (newVal !== oldVal) {
console.log(newVal, oldVal);
}
});
});