Estou atualizando programaticamente alguns dos campos em meu formulário com um valor e gostaria de definir o estado do campo como $dirty
. Fazendo algo como:
$scope.myForm.username.$dirty = true;
não parece funcionar.
Existe um método $setPristine
que posso usar para redefinir o estado do campo, mas não existe um $setDirty
método?
Então, como fazer isso?
Eu vi esta postagem https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4, mas não consigo encontrar o $setDirty
método. Estou usando a versão 1.1.5 do Angular.
$setDirty
nível de campo.Respostas:
Desde AngularJS 1.3.4 você pode usar
$setDirty()
em campos ( fonte ). Por exemplo, para cada campo com erro e marcado como obrigatório, você pode fazer o seguinte:fonte
No seu caso,
$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue);
resolve o problema - torna o formulário e o campo sujos e acrescenta as classes CSS apropriadas.Para ser sincero, encontrei essa solução em nova postagem no tópico do link da sua pergunta. Funcionou perfeitamente para mim, então estou colocando isso aqui como uma resposta autônoma para torná-la mais fácil de ser encontrada.
EDITAR:
A solução acima funciona melhor para a versão Angular até 1.3.3. A partir de 1.3.4, você deve usar o método API recém-exposto
$setDirty()
dengModel.NgModelController
.fonte
$scope.myForm.myField.$pristine = false; $scope.myForm.myField.$setViewValue(...)
. Parece que a resposta abaixo informando quefield.$setDirty()
foi adicionado no Angular 1.3.4 será a melhor soluçãovocê terá que definir manualmente
$dirty
paratrue
e$pristine
parafalse
para o campo. Se quiser que as classes apareçam em sua entrada, você terá que adicionarng-dirty
e remover manualmente asng-pristine
classes do elemento. Você pode usar$setDirty()
no nível do formulário para fazer tudo isso no próprio formulário, mas não nas entradas de formulário, as entradas de formulário não têm atualmente$setDirty()
como você mencionou.Esta resposta pode mudar no futuro à medida que devem ser adicionadas
$setDirty()
às entradas, parece lógico.fonte
Se você tiver acesso ao NgModelController (você só pode obter acesso a ele por meio de uma diretiva), poderá chamar
fonte
Fiz um jsFiddle apenas para você que resolve esse problema. simplesmente defina $ dirty como true, mas com
$timeout 0
so será executado após o DOM ser carregado.Encontre aqui: JsFiddle
fonte
Isto é o que funcionou para mim
fonte
Você pode usar o
$setDirty();
método. Veja a documentação https://docs.angularjs.org/api/ng/type/form.FormControllerExemplo:
fonte
Uma função auxiliar para fazer o trabalho:
fonte
Angular 2
Para quem quer fazer o mesmo no Angular 2, é muito semelhante, exceto pelo controle do formulário
fonte
Uma pequena nota adicional à resposta de @rmag. Se você tiver campos vazios, mas obrigatórios que deseja tornar sujos, use isto:
fonte
Não sei exatamente por que você está tentando marcar os campos como incorretos, mas me encontrei em uma situação semelhante porque queria que erros de validação aparecessem quando alguém tentasse enviar um formulário inválido. Acabei usando jQuery para remover as
.ng-pristine
tags de classe e adicionar.ng-dirty
tags de classe aos campos apropriados. Por exemplo:fonte