106

フォームのいくつかのフィールドをプログラムで値で更新しています。フィールドの状態を に設定したいと考えています$dirty。次のようなことをします:

$scope.myForm.username.$dirty = true;動作しないようです。

$setPristineフィールドの状態をリセットするために使用できる方法はありますが、方法はありません$setDirtyか?

では、これを行うにはどうすればよいでしょうか。

この投稿https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4$setDirtyを見ましたが、方法が見つからないようです。Angular バージョン 1.1.5 を使用しています。

4

11 に答える 11

87

あなたの場合、$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue);トリックを行います-フォームとフィールドの両方をダーティにし、適切なCSSクラスを追加します.

正直なところ、この解決策は、質問のリンクからのトピックの新しい投稿で見つかりました。私にとっては完璧に機能したので、見つけやすくするために、これをスタンドアロンの回答としてここに入れます。

編集:

上記のソリューションは、1.3.3 までの Angular バージョンに最適です。1.3.4 から、新しく公開された API メソッドを使用する必要があり$setDirty()ますngModel.NgModelController

于 2014-01-16T13:24:08.563 に答える
51

$setDirty()AngularJS 1.3.4 以降、フィールド ( source ) で使用できます。たとえば、エラーがあり、必須とマークされているフィールドごとに、次の操作を実行できます。

angular.forEach($scope.form.$error.required, function(field) {
    field.$setDirty();
});
于 2014-12-16T11:07:10.937 に答える
10

NgModelControllerにアクセスできる場合(ディレクティブからのみアクセスできます)、呼び出すことができます

ngModel.$setViewValue("your new view value");
// or to keep the view value the same and just change it to dirty
ngModel.$setViewValue(ngModel.$viewValue);
于 2013-12-11T16:53:54.240 に答える
7

これは私のために働いたものです

$scope.form_name.field_name.$setDirty()
于 2016-02-12T06:10:15.827 に答える
7

メソッドを使用できます$setDirty();。ドキュメントを参照してください https://docs.angularjs.org/api/ng/type/form.FormController

例:

$scope.myForm.$setDirty();
于 2016-04-07T06:02:19.853 に答える
5

仕事をするためのヘルパー関数:

function setDirtyForm(form) {
    angular.forEach(form.$error, function(type) {
        angular.forEach(type, function(field) {
            field.$setDirty();
        });
    });
    return form;
}
于 2015-08-04T13:49:32.697 に答える
4

角度 2

Angular 2で同じことをしようとしている人にとっては、フォームを把握することを除けば非常に似ています

<form role="form" [ngFormModel]="myFormModel" (ngSubmit)="onSubmit()" #myForm="ngForm">
<div class="form-group">
    <label for="name">Name</label>
    <input autofocus type="text" ngControl="usename" #name="ngForm" class="form-control" id="name" placeholder="Name">
    <div [hidden]="name.valid || name.pristine" class="alert alert-danger">
        Name is required
    </div>
</div>
</form>
<button type="submit" class="btn btn-primary" (click)="myForm.ngSubmit.emit()">Add</button>

import { Component, } from '@angular/core';
import { FormBuilder, Validators } from '@angular/common';

@Component({
    selector: 'my-example-form',
    templateUrl: 'app/my-example-form.component.html',
    directives: []
})
export class MyFormComponent {
    myFormModel: any;

    constructor(private _formBuilder: FormBuilder) {
        this.myFormModel = this._formBuilder.group({
            'username': ['', Validators.required],
            'password': ['', Validators.required]
        });
    }

    onSubmit() {
        this.myFormModel.markAsDirty();
        for (let control in this.myFormModel.controls) {
            this.myFormModel.controls[control].markAsDirty();
        };

        if (this.myFormModel.dirty && this.myFormModel.valid) {
            // My submit logic
        }
    }
}
于 2016-05-14T12:57:35.860 に答える
3

@rmagの回答への小さな追加メモ。ダーティにしたい空の必須フィールドがある場合は、次を使用します。

$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue !== undefined 
    ? $scope.myForm.username.$viewValue : '');
于 2014-08-20T18:23:38.400 に答える