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.