angular ng-model 不更新脏值

angular ng-model don't update on dirty value

我想知道是否可以 'prevent' 更新由于用户交互而变脏的表单字段(输入,select...)。 如果我更新 ng-model 原语(即:将 pippo 从 1 设置为 X)输入 即使我手动编辑控件也会更新。

有可能避免这种情况吗?

demo page:

http://plnkr.co/edit/ClXoS7YVcEDtcApsNpde

输入字段每 X 秒计数 UP。 如果我输入 "AAA" 我希望停止更新,因为 由于用户交互,输入是 "dirty"。

如果我有问题,也许这就是您想要做的?

$scope.$watch("pippo", function(){
  if($scope.pippotmp != $scope.pippo)
     $scope.useredited = true;
});

更新答案

plunker

您可以将模型与输入变化分开......在一个临时变量中

在输入元素上添加 ngChange 属性,

Update Plunker

 <input type=text ng-model="pippo" ng-change="userChanged()"/>

 //controller
 $scope.pippo = 1;
 $scope.isUserChanged = false;
 $scope.counter= 1;

 $scope.userChanged = function(){
    $scope.isUserChanged = true;
 }

 this.update = function() {
    if(!$scope.isUserChanged){
        $scope.pippo += 1;
    }
 }
 $interval(this.update, 3000);

userChanged会在用户输入的时候调用,但是当pippo被controller中的其他方法改变时不会被调用,所以我们可以在userChanged中设置一个标志来指示是否输入已被用户覆盖

您可以使用 ngModelController 判断输入是否脏了。 https://docs.angularjs.org/api/ng/directive/ngModel

将您的 plunker 修改为 http://plnkr.co/edit/oJMrQZLugnzisqdXScvN?p=preview 更新函数看起来像

this.update = function() {
    if(!$scope.frmPippo.pippo.$dirty)
      $scope.pippo += 1;
}

我可能答错了问题,但如果我理解正确,那么 ng-model-option 就是您要找的。

例如,您可以仅在用户离开输入时更新模型 ng-model-options="{ updateOn: 'blur' }"

您可以在文档中阅读更多相关信息:https://docs.angularjs.org/api/ng/directive/ngModelOptions