【问题标题】:Cannot set a form field to dirty无法将表单域设置为脏
【发布时间】:2017-09-24 02:20:47
【问题描述】:

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

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

所以,我想我只是手动将表单设置为脏。但我收到“未定义”错误。

$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

我正在使用角度 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

【问题讨论】:

    标签: angularjs forms validation angular1.6


    【解决方案1】:

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

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

    控制器:

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

    这会起作用。

    现在我只想说,为什么要使用dirty来显示提交表单?为什么不使用 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>
    

    【讨论】:

    • 我很有希望,但这没有用。像这样记录表单值:$scope.myForm,仍然返回“未定义”。和以前一样,我可以登录 myForm 并获取表单的 DOM 元素。我的表单只有一个字段,一个下拉/选择。我不希望用户在选择某些内容之前能够单击按钮。这工作得很好,只有当我为他们预先填充字段时我才会遇到问题。
    • @WayneF.Kaskie 您是否在 formInit 中添加了设置加载数据?另一种可能性是,如果您使用一个选择框,您可以通过 ngModel 值进行检查。
    • 感谢您帮助我。我把 cod 放在一个 plunker 中来演示这个问题。
    • @WayneF.Kaskie plnkr.co/edit/lEissy?p=preview ,我添加了超时,但为什么不直接使用:ng-show="myField"
    • 谢谢费特拉!这行得通。我想了几种不同的方法来处理这个问题,因为表格很简单。但我知道这种技术应该是可行的,所以我想知道如何实现。
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2014-01-06
    • 2018-08-07
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多