2016-07-12 56 views
0

如果表达式匹配regex,我将self.display的值更改为true。我已将此逻辑写入$scope.$apply()块,但当if块被触发时,我得到Digest already in progress错误。根据控制器中的更新值查看未更新

局部视图模板 -

<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; 
} 

上述代码工作。当self.display为真时,它会在form内正确显示div,但我得到$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; 
}); 

上述技术不产生任何错误,但永远不会显示在form内的。

+0

请问你$范围是什么样子?你对范围有任何价值吗? –

+0

,为什么你不想在'$ scope'上设置'display'的值,这样可以为你处理剩下的问题? –

回答

0

您只需要使用$ scope。$ apply()当您在外部执行角度控制器的范围时。例如,如果您使用的是JQuery或纯javascript的事件来触发回调,那么您可以在该回调中使用$ apply()。

没有看到所有的代码,这是很难说的问题是什么,但我最初的想法是,你应该如果您使用的是可以用的,而不是“self.display”

+0

我正在使用'controllerAs'语法,因为您可能已经想通了。这就是为什么我不想使用'$ scope'。我相信有一个更好的方式来实现这个,而不是使用'$ scope'。 – Aaron

0

$ scope.display指令,您需要使用bindToController选项,以便角度监视您的控制器实例上的值。否则,如果你只是用一个简单的控制器,只是想用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); 
    } 
    }); 
}); 
+0

我正在使用'controllerAs'语法,因为你可能已经想通了。这就是为什么我不想使用'$ scope'。如果你不熟悉这个概念,这里是一个很好的资源 - http://codetunnel.io/angularjs-controller-as-or-scope/ – Aaron

+0

我更新了我的答案,看看是否有道理。此外,如果您在此处放置更多相关的控制器部件,也会有所帮助。 –