查看未根据控制器中的更新值进行更新

时间:2016-07-12 21:27:19

标签: javascript angularjs

如果表达式与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永远不会显示。

2 个答案:

答案 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);
    }
  });
});