AngularJS: come faccio a impostare manualmente l'input su $ valid nel controller?


92

Utilizzando il TokenInput plug-in e l'utilizzo AngularJS built-in di convalida formController.

In questo momento sto cercando di verificare se il campo contiene testo, quindi impostare il campo su valido se lo fa. Il problema con l'utilizzo del plug-in è che crea il proprio input e quindi un ul + li per lo stlying.

Ho accesso a addItem (formname) e alle mie capacità nel controller, devo solo impostarlo su $ valid.

Markup.

<form class="form-horizontal add-inventory-item" name="addItem">
     <input id="capabilities" name="capabilities" token-input data-ng-model="inventoryCapabilitiesAutoComplete" data-on-add="addCapability()" data-on-delete="removeCapability()" required>
     <div class="required" data-ng-show="addItem.capabilities.$error.required" title="Please enter capability."></div>
</form>

JS.

$scope.capabilityValidation = function (capability) {
  if (capability.name !== "") {
    addItem.capabilities.$valid = true;
    addItem.capabilities.$error.required = false;
  } else {
    addItem.capabilities.$valid = false;
    addItem.capabilities.$error.required = true;
  }
};

Sto eseguendo la funzione CapacityValidation quando TokenInput ha qualcosa inserito e che passa nell'oggetto.

MODIFICARE:

Ho scoperto che ng-model sul mio input fa cose e ottiene i risultati del completamento automatico, motivo per cui non riesco a far funzionare ng-valid poiché è basato sul modello.

$scope.inventoryCapabilitiesAutoComplete = {
  options: {
    tokenLimit: null
  },
  source: urlHelper.getAutoComplete('capability')
};

Non ho scritto questa implementazione del completamento automatico, c'è un altro modo per farlo in cui avrei accesso a ng-model attr e spostare la funzione del modello da qualche altra parte?


1
Dal momento che il tuo plugin sta creando il proprio input e hai scritto una funzione per eseguire la tua convalida, perché non usare anche la tua proprietà $ scope anche per la convalida: <div ... data-ng-show="capabilities_error" ...> In altre parole, c'è una ragione per cui vuoi / devi usare FormController?
Mark Rajcok

2
Dato che tutti gli altri miei moduli lo stanno usando, mi piacerebbe mantenere il controllo che dà. L'input creato dal plug-in imposta effettivamente il valore nel mio input originale, che devo quindi verificare nella mia convalida ma non aggiorna il formController quando c'è un valore immesso.
Christopher Marshall

Ho accorciato il markup apposta per isolare l'input. Ho molti più input in questa stessa forma.
Christopher Marshall

1
Va bene. Hai provato addItem.capabilities.$valid = truee / o hai impostato addItem.capabilities. $ Error.required su true o false a seconda dei casi?
Mark Rajcok

Ho provato entrambi. Aggiornerò la mia domanda per mostrartela. $ Valid e $ error.required vengono visualizzati come non definiti nel mio punto di interruzione nel controller ma addItem.capabilities ha ancora dati.
Christopher Marshall

Risposte:


150

Non è possibile modificare direttamente la validità di un modulo. Se tutti gli input discendenti sono validi, il modulo è valido, altrimenti non lo è.

Quello che dovresti fare è impostare la validità dell'elemento di input. Così;

addItem.capabilities.$setValidity("youAreFat", false);

Ora l'input (e quindi il modulo) non è valido. Puoi anche vedere quale errore causa l'annullamento.

addItem.capabilities.errors.youAreFat == true;

1
E se capabilitiesfosse una variabile? Ho un array che contiene nomi di input e voglio eseguire il loop all'interno dell'array e impostarli come non validi uno per uno: /
lightalex

1
Cosa intendi per variabile? È direttamente collegato al modulo stesso, non ai valori nel modulo. Utilizza l' nameattributo del modulo e l' attributo dell'input id. Questo è diverso dai valori impostati dangModel
Umur Kontacı

11
Ho trovato la soluzione ma questo era quello che volevo dire:$scope.addItem['myVariableName'].$setValidity("youAreFat", false);
lightalex

Dopo questo sembra che alcuni campi di input non siano più convalidati su modifica o sfocatura
Leonardo

4
Su angular 1.4.7 e ho dovuto anteporre a questo codice $ scope ..$scope.addItem.capabilities.$setValidity("youAreFat", false);
Graham T

60

Le risposte sopra non mi hanno aiutato a risolvere il mio problema. Dopo una lunga ricerca mi sono imbattuto in questa soluzione parziale .

Ho finalmente risolto il mio problema con questo codice per impostare manualmente il campo di input su ng-invalid (per impostare su ng-valid impostalo su 'true'):

$scope.myForm.inputName.$setValidity('required', false);

3
Ho fatto la stessa cosa e funziona alla grande. Ma ora ho alcuni problemi con la riconvalida dello stesso campo. Non cambia allo stato modificato, il che è molto ansioso. Uso ng-model-options = "{updateOn: 'submit'}" per convalidare facendo clic su un pulsante. Qualche idea su questo?
OliverKK

1
@OliverKK dovrai invocare $setValiditycon truecome secondo parametro ogni volta che l'input è valido.
Bernhard Hofmann

10
non ha senso usare il rootscope, dovrebbe essere solo l'ambito
Ryan M

1
Ho provato una soluzione simile, ma il problema che ho riscontrato è che se poi provo a modificare il valore del controllo nel modulo, rimane non valido. Nel mio caso quel controllo è una direttiva con la selezione interna. Se imposto l'invalido per la mia direttiva (che è ng-form), non sono in grado di rimuovere quello stato non valido.
Naomi

18

Mi sono imbattuto in questo post con un problema simile. La mia soluzione è stata quella di aggiungere un campo nascosto per mantenere il mio stato non valido per me.

<input type="hidden" ng-model="vm.application.isValid" required="" />

Nel mio caso avevo un valore bool nullable che una persona doveva selezionare uno dei due pulsanti diversi. se rispondono sì, un'entità viene aggiunta alla raccolta e lo stato del pulsante cambia. Fino a quando non viene data risposta a tutte le domande (uno dei pulsanti in ciascuna delle coppie ha un clic) il modulo non è valido.

vm.hasHighSchool = function (attended) { 
  vm.application.hasHighSchool = attended;
  applicationSvc.addSchool(attended, 1, vm.application);
}
<input type="hidden" ng-model="vm.application.hasHighSchool" required="" />
<div class="row">
  <div class="col-lg-3"><label>Did You Attend High School?</label><label class="required" ng-hide="vm.application.hasHighSchool != undefined">*</label></div>
  <div class="col-lg-2">
    <button value="Yes" title="Yes" ng-click="vm.hasHighSchool(true)" class="btn btn-default" ng-class="{'btn-success': vm.application.hasHighSchool == true}">Yes</button>
    <button value="No" title="No" ng-click="vm.hasHighSchool(false)" class="btn btn-default" ng-class="{'btn-success':  vm.application.hasHighSchool == false}">No</button>
  </div>
</div>

2

È molto semplice. Ad esempio: nel tuo controller JS usa questo:

$scope.inputngmodel.$valid = false;

o

$scope.inputngmodel.$invalid = true;

o

$scope.formname.inputngmodel.$valid = false;

o

$scope.formname.inputngmodel.$invalid = true;

Tutto funziona per me per esigenze diverse. Se questo risolve il tuo problema, contattaci.

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.