Já tentei seguir o exemplo de outras respostas daqui e não consegui!
Criei um formulário reativo (ou seja, dinâmico) e quero desabilitar alguns campos a qualquer momento. Meu código de formulário:
this.form = this._fb.group({
name: ['', Validators.required],
options: this._fb.array([])
});
const control = <FormArray>this.form.controls['options'];
control.push(this._fb.group({
value: ['']
}));
meu html:
<div class='row' formArrayName="options">
<div *ngFor="let opt of form.controls.options.controls; let i=index">
<div [formGroupName]="i">
<select formArrayName="value">
<option></option>
<option>{{ opt.controls.value }}</option>
</select>
</div>
</div>
</div>
Reduzi o código para facilitar. Quero desativar o campo de seleção de tipo. Tentei fazer o seguinte:
form = new FormGroup({
first: new FormControl({value: '', disabled: true}, Validators.required),
});
não está funcionando! Alguém tem uma sugestão?
first
? `:)value
não é um formArray, é um formControlName. Se você quiservalue
ser um formArray, terá que alterá-lo. Atualmente é um formControlName. Então, se você quiser que todo o campo de seleção seja desabilitado, basta mudar<select formArrayName="value">
para<select formControlName="value">
Respostas:
ou
fonte
if
instruções. Depois que o formulário é enviado, todo o formulário é desativado novamente.Preste atenção
Se você estiver criando um formulário usando uma variável para condição e tentando alterá-la mais tarde, ele não funcionará, ou seja, o formulário não será alterado .
Por exemplo
e se você mudar a variável
a forma não mudará. Você deveria usar
BTW.
Você deve usar o método patchValue para alterar o valor:
fonte
É uma má prática usar desativar em um DOM com formas reativas. Você pode definir esta opção em seu
FormControl
, ao iniciar o dePropriedade
value
não é necessáriaOu você pode obter seu controle de formulário com
get('control_name')
e definirdisable
fonte
It looks like you’re using the disabled attribute with a reactive form directive. If you set disabled to true when you set up this control in your component class, the disabled attribute will actually be set in the DOM for you. We recommend using this approach to avoid ‘changed after checked’ errors
. Portanto, a maneira recomendada de alterar o estado de habilitar / desabilitar diretamente por meio dos controles. Além disso, você pode verificar este ótimo tópico netbasal.com/…Eu resolvi isso envolvendo meu objeto de entrada com seu rótulo em um conjunto de campos: O conjunto de campos deve ter a propriedade disabled ligada ao booleano
fonte
O
disabling
FormControlprevents
deve estar presente em um formulário whilesaving
. Você pode apenas definir areadonly
propriedade.E você pode conseguir desta forma:
HTML:
TS:
Encontrei isso aqui
fonte
form.getRawValue()
para incluir os valores dos controles desativadosSe usar
disabled
elementos de entrada de formulário (como sugerido na resposta correta como desabilitar a entrada ), a validação para eles também será desabilitada, preste atenção a isso!(E se você estiver usando o botão de envio,
[disabled]="!form.valid"
ele excluirá seu campo da validação)fonte
Uma abordagem mais geral seria.
fonte
Se você deseja desabilitar
first
(formcontrol), então você pode usar a instrução abaixo.this.form.first.disable();
fonte
Isso funcionou para mim:
this.form.get('first').disable({onlySelf: true});
fonte
Ou formcontrol 'primeiro'
Você pode definir desativar ou ativar no conjunto inicial.
fonte
fonte
A melhor solução está aqui:
https://netbasal.com/disabling-form-controls-when-working-with-reactive-forms-in-angular-549dd7b42110
Esboço da solução (em caso de link quebrado):
(1) Crie uma diretiva
(2) Use-o assim
(3) Uma vez que as entradas desativadas não são exibidas em form.value no envio, você pode precisar usar o seguinte (se necessário):
fonte
this.form.get('FIELD_NAME').patchValue(DYNAMIC_VALUE)
, mostro o formControl. quando passou para a diretiva, mostra Não é possível ler a propriedade 'desativar' de indefinidoEu tive o mesmo problema, mas chamar this.form.controls ['name']. Disable () não corrigiu isso porque eu estava recarregando minha visualização (usando router.navigate ()).
No meu caso, tive que redefinir meu formulário antes de recarregar:
this.form = indefinido; this.router.navigate ([caminho]);
fonte
fonte
Você pode declarar uma função para ativar / desativar todo o controle do formulário:
e usar assim
fonte
Para fazer um campo desabilitar e habilitar de angular forma reactiva 2+
1. Para desativar
<input class="form-control" name="Firstname" formControlName="firstname" [attr.disabled]="true">
Para habilitar
Habilitar formulário inteiro
this.formname.enable();
Habilitar campo específico sozinho
this.formname.controls.firstname.enable();
Isso funciona bem. Comentário para consultas.
fonte