无法将表单域设置为脏

Cannot set a form field to dirty

我一直在寻找这个问题的答案并遇到了几个帖子,但是 none 对我有用。

我想做一些简单的事情。我有一个按钮,在表单变脏之前是不可见的。如果我手动弄脏表单,这会很好用。但是,我正在保存数据。当加载表单时,保存的数据被填充,但是当后端数据以这种方式更新时,表单并不脏。

所以,我想我只是手动将表单设置为脏。但是我收到 "undefined" 个错误。

$scope.myForm = > undefined
$scope.$myForm => undefined
myForm = > returns the form object
myForm.myField = > returns the field
myForm.myField.$dirty => returns undefined
myForm.myField.$setDirty() = > returns "$setDirty is not a function"
this (inside my controller) = > returns and empty object

我正在使用 angular 1.6.6 我读了: Angular.js programmatically setting a form field to dirty,

How to explicitly set a text box in a form to dirty?,

How to set a particular field in a form to dirty in angularjs 1.3

我的基本形态:

<div ng-controller="appCtrl">
    <form name="myForm">
        <input name="myField" ng-model="myField" />
        <div ng-click="doSomething()" ng-show="myForm.myField.$dirty">Submit</div>
    </form>
</div>

我添加了一个 plunker 来显示我遇到的问题。 https://plnkr.co/edit/ZUWywfOj329g6sviHIZf?p=preview

问题是在controller中的代码执行的那一刻dom还没有创建表单,所以解决方法是在初始化表单的时候调用你的数据初始化。

<form name="myForm" ng-init="formInit()">

控制器:

$scope.formInit = function() {
    $timeout(function() {
      $scope.myForm.$setDirty(); 
    })
}

这会起作用。

现在我只想说,为什么用dirty来显示submit form?为什么不使用 required 和 myForm.$valid 进行验证?

为什么不直接使用:

<div ng-controller="appCtrl">
    <form name="myForm">
        <input name="myField" ng-model="myField" />
        <div ng-click="doSomething()" ng-show="myField">Submit</div>
    </form>
</div>