Come disabilitare un ingresso in angular2


123

In ts is_edit = trueda disabilitare ...

<input [disabled]="is_edit=='false' ? true : null" id="name" type="text" [(ngModel)]="model.name" formControlName="name" class="form-control" minlength="2">

Voglio semplicemente disabilitare un input basato su trueo false.

Ho provato a seguire:

[disabled]="is_edit=='false' ? true : null"
[disabled]="is_edit=='true'"
[disabled]="is_edit"

10
Hai già posto questa domanda e avevi già una risposta, ma poi hai eliminato la domanda. Ancora una volta, apri la console del browser per notare gli errori, correggili (ad es. Usa name e non formControlName) e poi funziona: plnkr.co/edit/al2IkGkaZKpdLKKTfvKh?p=preview
JB Nizet

Il vero problema qui è che stai mescolando forme basate su modelli con forme reattive. Usa l'uno o l'altro, non entrambi. @ AJT_82 ha la risposta corretta.
adam0101

Risposte:


317

Prova a usare attr.disabled, invece didisabled

<input [attr.disabled]="disabled ? '' : null"/>

5
Impostare il valore di attr su null per NON aggiungere l'attr all'elemento - sembra un trucco - ma in realtà funziona, e ha anche senso, a posteriori.
c69

2
disabledè uguale a trueofalse
Belter

18
Grazie per una risposta che funziona davvero! Allora perché attr.disabledfunziona quando disabledno?
Dylanthepiguy

5
Sebbene funzioni, è un hack che non risolve il vero problema di mescolare moduli basati su modelli con moduli reattivi. L'OP dovrebbe usare l'uno o l'altro, non entrambi.
adam0101

2
<input [attr.disabled] = "disabled || null" /> Penso che funzioni anche
Francesco

41

Penso di aver capito il problema, questo campo di input fa parte di un modulo reattivo (?), Dato che hai incluso formControlName. Ciò significa che ciò che stai cercando di fare disabilitando il campo di input con is_editnon funziona, ad esempio il tuo tentativo [disabled]="is_edit", che in altri casi funzionerebbe. Con il tuo modulo devi fare qualcosa del genere:

toggle() {
  let control = this.myForm.get('name')
  control.disabled ? control.enable() : control.disable();
}

e perdere il is_edittutto.

se vuoi che il campo di input sia disabilitato come predefinito, devi impostare il controllo del modulo come:

name: [{value: '', disabled:true}]

Ecco un plunker


30

Potresti semplicemente farlo

<input [disabled]="true" id="name" type="text">

1
Anche se funziona, suggerisce che "false" abiliterebbe il controllo, cosa che non lo fa poiché la presenza dell'attributo disabilitato è ciò che ha disabilitato il controllo, non il valore.
Mecaveli

@Mecaveli, impostando [disabled] su false si abilita effettivamente il controllo. <input [disabled] = "false" id = "name" type = "text"> abilita il campo di input. Potresti controllare la tua applicazione angolare.
Ifesinachi Bryan

1
Giusto per correggermi qui: come ho imparato, [disabled] non controlla effettivamente il valore dell'attributo html "disabled" come farebbe [attr.disabled]. Pertanto, [disabled] = "false" funziona anche se "false" come valore per l'attributo html "disable" no.
Mecaveli

6
Quindi, tutto sommato, dovresti effettivamente usare il tuo editor e provarlo prima di tirare fuori un punto di contrasto.
Ifesinachi Bryan

In effetti, scusa per il downvoting, purtroppo non posso annullarlo ora. Ho usato impropriamente [attr.disabled] per anni pensando (o meglio non pensavo molto) è uguale a [disabled] ...
Mecaveli

26

Se vuoi disabilitare l'input su qualche istruzione. utilizzare [readonly]=trueo falseinvece di disabilitato.

<input [readonly]="this.isEditable" 
    type="text" 
    formControlName="reporteeName" 
    class="form-control" 
    placeholder="Enter Name" required>

1
Soluzione reattiva.
John Deer

1
Questo è corretto. Per me [attr.disabled] = "disabled" ha funzionato solo unidirezionale, ovvero l'input è rimasto nello stato iniziale disabilitato / abilitato
spiritworld

Grazie mille per questo !
Nazir,

Nazirnessun problema
Usman Saleh il

13
<input [disabled]="is_edit" id="name" type="text">
<button (click)="is_edit = !is_edit">Change input state</button>

export class AppComponent {
  is_edit : boolean = false;
}

1
Se si inserisce il log della console nel metodo isDisabled, vengono eseguiti centinaia di log della console. Se è presente una logica complessa nel metodo isDisabled, potrebbe essere un problema. Quindi non sono sicuro che questa sia una buona soluzione.
Téwa

1
Non inserire il controllo dinamico nelle variabili angolari o ottieni un ciclo infinito. Puoi usare [disabled]="is_edit"direttamente. Perché la isDisabled()funzione?
alex351

aggiorna il codice per modificare direttamente lo stato di ingresso.
Yoav Schniederman,

7

Presumo che tu intendessi falseinvece di'false'

Inoltre, [disabled]si aspetta un file Boolean. Dovresti evitare di restituire un file null.


4

Una nota in risposta al commento di Belter sulla risposta accettata da fedtuck sopra, dal momento che mi manca la reputazione di aggiungere commenti.

Questo non è vero per nessuno dei quali sono a conoscenza, in linea con i documenti di Mozilla

disabilitato è uguale a vero o falso

Quando è presente l'attributo disabled, l'elemento è disabilitato indipendentemente dal valore. Vedi questo esempio

<input placeholder="i can be changed"/>
<input disabled placeholder="i can NOT be changed"/>
<input disabled="true" placeholder="i can NOT be changed"/>
<input disabled="false" placeholder="i can NOT be changed"/>

3
questo è vero e completamente vero per l'Html puro, ma per angular, devi fornire un valore booleano per disabled, specialmente quando esegui il binding a due vie.
Ifesinachi Bryan

4

Preferisco questa soluzione

Nel file HTML:

<input [disabled]="dynamicVariable" id="name" type="text">

Nel file TS:

dynamicVariable = false; // true based on your condition 

3

Quello che stai cercando è disabled = "true" . Ecco un esempio:

<textarea class="customPayload" disabled="true" *ngIf="!showSpinner"></textarea>

6
Questo non è corretto, l' disabledattributo HTML e DOM è un "attributo booleano", il che significa che deve essere specificato solo il nome dell'attributo - o il suo valore deve essere uguale disabled, ad esempio disabled="disabled" - it does not recognize the values of true` oppure false- quindi disabled="false"l'elemento verrà comunque disabilitato.
Dai

2

dimostrazione

make is_editdi tipo boolean.

<input [disabled]=is_edit id="name" type="text">

export class App {
  name:string;
  is_edit: boolean; 
  constructor() {
    this.name = 'Angular2'
    this.is_edit = true;
  }
}

2

Disabilita TextBox in Angular 7

<div class="center-content tp-spce-hdr">
  <div class="container">
    <div class="row mx-0 mt-4">
      <div class="col-12" style="padding-right: 700px;" >
          <div class="form-group">
              <label>Email</label>
                <input [disabled]="true" type="text" id="email" name="email" 
                [(ngModel)]="email" class="form-control">
          </div>
     </div>
   </div>
 </div>


0

E anche se la casella / pulsante di immissione deve rimanere disabilitata, allora semplicemente <button disabled>o <input disabled>funziona.


0

Disabilitato Selectin angolare 9.

una cosa tieni presente che disabilitato funziona con i booleanvalori in questo esempio, sto usando l' (change)evento con l' selectopzione se il paese non è selezionato, la regione sarà disabilitata.

find.component.ts file

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-find',
  templateUrl: './find.component.html',
  styleUrls: ['./find.component.css']
})
export class FindComponent implements OnInit {
  isCountrySelected:boolean;

  constructor() { }
  //onchange event disabled false
 onChangeCountry(id:number){
   this.isCountrySelected = false;
 }
  ngOnInit(): void {
    //initially disabled true
    this.isCountrySelected = true;
  }

}

find.component.html

//Country select option
<select  class="form-control"  (change)="onChangeCountry()" value="Choose Country">
                    <option value="">Choose a Country</option>
                    <option value="US">United States</option>
                     
</select>
//region disabled till country is not selected 
<select class="form-control" [disabled]="isCountrySelected">
                    <option value="">Choose a Region</option>
                    <option value="">Any regions.</option>
                    
                </select>

-1

può usare semplicemente like

     <input [(ngModel)]="model.name" disabled="disabled"

L'ho capito in questo modo. quindi preferisco.


Questo non significa impostare dinamicamente l'attributo disabilitato
Benjineer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.