Angular.js가 프로그래밍 방식으로 양식 필드를 더티로 설정


105

내 양식의 일부 필드를 값으로 프로그래밍 방식으로 업데이트하고 필드 상태를로 설정하고 싶습니다 $dirty. 다음과 같이합니다.

$scope.myForm.username.$dirty = true; 작동하지 않는 것 같습니다.

$setPristine필드 상태를 재설정하는 데 사용할 수 있는 방법 이 있지만 $setDirty방법이 없습니까?

그럼 어떻게해야할까요?

이 게시물 https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4를 보았지만 $setDirty방법 을 찾을 수없는 것 같습니다 . Angular 버전 1.1.5를 사용하고 있습니다.


일부 (기본값) 값을 설정해야 할 수도 있습니까?
— Cherniv 2013-08-06

3
는 $를 setDirty 방법은 여기에 설명되어 있습니다 : docs.angularjs.org/api/ng.directive:form.FormController
— 데이비드 린

2
형식 수준에있는 것 같습니다. 나는 $setDirty현장 수준에서 필요 합니다.
— super9

이 문제에 대한 해결책은 앵귤러가 해당 유형의 필드에 바인딩하는 데 사용하는 이벤트 리스너 리스너를 찾고 업데이트 직후 수동으로 해당 리스너를 실행하는 것입니다. </ uglyHack>
— bguiz

나는 프로그래밍 방식으로 클래스를 변경하려고 생각하고 있었지만 내가 생각했던 올바른 방식으로 양식 필드의 상태를 변경하지 않을 것입니다 ...
— super9

답변:


51

AngularJS 1.3.4부터는 $setDirty()필드 ( source ) 에서 사용할 수 있습니다 . 예를 들어 오류가 있고 필수로 표시된 각 필드에 대해 다음을 수행 할 수 있습니다.

angular.forEach($scope.form.$error.required, function(field) {
    field.$setDirty();
});

87

귀하의 경우 $scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue);에는 트릭을 수행하십시오. 양식과 필드를 모두 더럽 히고 적절한 CSS 클래스를 추가합니다.

솔직히 말해서 질문의 링크에서 주제의 새 게시물 에서이 솔루션을 찾았습니다. 그것은 나에게 완벽하게 작동했기 때문에 쉽게 찾을 수 있도록 독립형 답변으로 여기에 넣습니다.

편집하다:

위의 솔루션은 최대 1.3.3의 Angular 버전에서 가장 잘 작동합니다. 1.3.4 시작하면 새로 노출 된 API 방법을 사용해야 $setDirty()에서을 ngModel.NgModelController.


이것은 Angular 1.3.0-beta5와 1.3.0 사이에서 변경된 것처럼 보였습니다. 여기서 1.3.0은 $ viewValue가 변경되지 않는 한 필드를 $ pristine으로 유지합니다. 나는해야했다 $scope.myForm.myField.$pristine = false; $scope.myForm.myField.$setViewValue(...). field.$setDirty()Angular 1.3.4에 추가 된 아래 답변 이 더 나은 솔루션이 될 것입니다
— Johann

4
메모 주셔서 감사합니다 당신은. "1.3.4 시작 1.3.3까지 당신은 새로운 API 메소드를 노출 사용해야한다"내 일을 저장
— 아흐메드 마흐무드을

사용자 rmag, 각도 2는 어떻습니까?
— user5260143 nov.

17

필드 에 대해 및 로 수동으로 설정 $dirty해야 합니다. 클래스가 입력에 나타나도록 하려면 요소에서 클래스 를 수동으로 추가 하고 제거 해야합니다 . 양식 수준에서를 사용 하여 양식 자체에서이 모든 작업을 수행 할 수 있지만 양식 입력은 불가능하며 현재 언급 한대로 양식 입력에는 없습니다 .true$pristinefalseng-dirtyng-pristine$setDirty()$setDirty()

이 답변은 $setDirty()입력에 추가해야하므로 향후 변경 될 수 있으며 논리적으로 보입니다.


3
$ setPristine ()은 입력 필드 수준에 있지만 1.2.26에서는 여전히 $ setDirty가 없습니다. :-(
— Sebastian

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

감사합니다! 내가 찾던 바로 그것.
— dreyln 2014 년

10

이 문제를 해결하는 jsFiddle을 만들었습니다. $ dirty를 true로 설정하기 만하면 $timeout 0DOM이로드 된 후에 실행됩니다.

여기에서 찾기 : JsFiddle

$timeout(function () {
  $scope.form.uName.$dirty = true;
}, 0);



5

작업을 수행하는 도우미 기능 :

function setDirtyForm(form) {
    angular.forEach(form.$error, function(type) {
        angular.forEach(type, function(field) {
            field.$setDirty();
        });
    });
    return form;
}

안타깝게도 실수로이 항목을 반대표로 표시했습니다. 되돌리려면 어떻게해야합니까? 그래서 대답을 편집하지 않고서는이 일을 할 수 없다고 ..
— smk

이것은 잘 작동합니다. 'form. $ error'확인으로 upvoting하면 사용자가 건드리지 않았지만 유효한 필드를 '더럽히는'필드가 아닌지 확인합니다.
— Sam T

감사합니다! 쉽고 간단한 솔루션. 가장 빠르지는 않을 수도 있지만 무거운 작업을 수행하지 않으므로 imo는 중요하지 않습니다. 잘 했어!
— jwanglof

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

3

@rmag의 답변에 대한 작은 추가 메모. 비어 있지만 더티 만들고 싶은 필수 필드가 있으면 다음을 사용하십시오.

$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue !== undefined 
    ? $scope.myForm.username.$viewValue : '');

이것이 마침내 저를 도왔던 대답입니다!
— Kirk Liemohn

-1

왜 필드를 더럽게 표시하려고하는지 정확히 모르겠지만 누군가 잘못된 양식을 제출하려고 할 때 유효성 검사 오류가 표시되기를 원했기 때문에 비슷한 상황에 처했습니다. 결국 jQuery를 사용하여 .ng-pristine클래스 태그 를 제거 .ng-dirty하고 적절한 필드에 클래스 태그를 추가했습니다 . 예를 들면 :

$scope.submit = function() {
    // `formName` is the value of the `name` attribute on your `form` tag
    if (this.formName.$invalid)
    {
        $('.ng-invalid:not("form")').each(function() {
            $(this).removeClass('ng-pristine').addClass('ng-dirty');
        });
        // the form element itself is index zero, so the first input is typically at index 1
        $('.ng-invalid')[1].focus();
    }
}

5
이미 AngularJS를 사용하고 있다는 점을 감안할 때 jQuery 솔루션은 과도하게 보입니다. 예를 들어 많은 사람들은 AngularJS와 함께 jQuery를 사용하지 않는 것을 선호합니다.
— StevenClontz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.