2015-12-16 14 views
11

Non sto facendo nulla di troppo speciale.

Ho un input che desidero convalidato con ogni tratto di tasto. Se la convalida fallisce, visualizza l'errore. Non aspettare che l'evento di sfocatura faccia scattare il $ toccato.

Ho pensato che fosse il caso predefinito, ma a quanto pare non lo è. Sto usando materiali angolari insieme a messaggi angolari. Lo sto facendo per il rilevamento di capslock.

Il markup:

<form name="primaryLogin" novalidate> 
    <md-content layout-padding layout="column"> 
     <md-input-container flex> 
      <label>Login ID</label> 
      <input type="text" required="" name="login" ng-model="primary.loginID" capslock> 

      <div ng-messages="primaryLogin.$error"> 
       <div ng-message="required"> 
        Please enter a Login ID. 
       </div> 

       <div ng-message="capslock"> 
        Caps Lock is ON! 
       </div> 
      </div> 

      <pre>{{ primaryLogin | json }}</pre> 

     </md-input-container> 

    </md-content> 
</form> 

Quando ho vengo alla pagina, attivare il blocco maiuscole, e iniziare a digitare, il mio messaggio di errore sembra in questo modo:

{ 
    "$error": { 
    "capslock": [ 
     { 
     "$viewValue": "Q", 
     "$validators": {}, 
     "$asyncValidators": {}, 
     "$parsers": [ 
      null 
     ], 
     "$formatters": [ 
      null, 
      null 
     ], 
     "$viewChangeListeners": [], 
     "$untouched": false, 
     "$touched": true, 
     "$pristine": false, 
     "$dirty": true, 
     "$valid": false, 
     "$invalid": true, 
     "$error": { 
      "capslock": true 
     }, 
     "$name": "login", 
     "$options": { 
      "debounce": 100, 
      "updateOnDefault": true 
     } 
     } 
    ] 
    }, 
    "$name": "primaryLogin", 
    "$dirty": true, 
    "$pristine": false, 
    "$valid": false, 
    "$invalid": true, 
    "$submitted": false, 
    "login": { 
    "$viewValue": "Q", 
    "$validators": {}, 
    "$asyncValidators": {}, 
    "$parsers": [ 
     null 
    ], 
    "$formatters": [ 
     null, 
     null 
    ], 
    "$viewChangeListeners": [], 
    "$untouched": true, 
    "$touched": false, 
    "$pristine": false, 
    "$dirty": true, 
    "$valid": false, 
    "$invalid": true, 
    "$error": { 
     "capslock": true 
    }, 
    "$name": "login", 
    "$options": { 
     "debounce": 100, 
     "updateOnDefault": true 
    } 
    } 
} 

Quindi questo sembra essere funziona come previsto, ma il messaggio di errore effettivo non viene visualizzato fino a quando l'evento di sfocatura non viene attivato su quell'input specifico. Quindi posso entrare con capslock, digitare 10 caratteri, l'oggetto error dice che l'errore di capslock è presente, ma poiché $ ha toccato non è vero, quindi non mostra.

Una volta $ touched è impostato su true, quindi posso tornare all'input e tutto funziona come previsto.

Qualche idea? Grazie in anticipo!

+0

Qual è l'attributo 'capslock'? – tasseKATT

+0

@tasseKATT L'attributo capslock è una direttiva personalizzata per il rilevamento di capslock. Ha il proprio stato di errore per visualizzare i messaggi. – TyMayn

+0

Nota: in genere quando si desidera forzare le persone a utilizzare lettere minuscole, basta forzare le lettere minuscole anziché la convalida, vedere http://stackoverflow.com/questions/16388562/angularjs-force-uppercase-in-textbox – Walfrat

risposta

16

Change

<div ng-messages="primaryLogin.$error"> 

a

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty"> 

Si può anche provare

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$touched"> 

O

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$pristine"> 

È inoltre possibile club come il modo per condizionale e verificare:

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty && primaryLogin.login.$touched && primaryLogin.login.$pristine"> 

o condizionale o controllare:

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty || primaryLogin.login.$touched || primaryLogin.login.$pristine"> 

provare il sopra uno per uno per scoprire a seconda di quale si incontra il vostro caso.

+0

Grazie signore. Aggiungendo 'ng-show =" primaryLogin.login. $ Dirty "' ha fatto il trucco. Ho pensato che i messaggi ng lo gestissero come un ng-show. Puoi dare qualche spiegazione sul perché funziona? – TyMayn

+1

@TyMayn ng-messages inizia a mostrare i messaggi di errore non appena la pagina viene caricata. Ma potresti non volerlo. Potresti voler controllare quando mostrare quei messaggi di errore. $ sporco significa che l'utente ha interagito con l'elemento. Quindi per il testo del tipo di input, ciò significherebbe che l'utente ha inserito del testo (anche un singolo carattere viene catturato). Questo NON è sfocato, quindi l'utente può ancora avere il suo cursore nella casella di testo e continuare a inserire qualcosa e tutto ciò che verrà catturato da $ sporco. $ toccato è dove l'utente ha fatto clic su un controllo ma si è allontanato senza rilasciarlo. $ pristine è dove l'utente non ha fatto clic/sfocatura di un controllo. – Devner

2

Nella versione 1.0 di materiale angolare (ad esempio < = v0.11.4), è il caso: il messaggio ng è stato visualizzato per impostazione predefinita.

Tuttavia, i material design spec stati:

Visualizza testo dell'errore solo dopo l'interazione dell'utente con un campo. Se l'utente immette dati errati, il testo di supporto potrebbe trasformarsi in testo di errore.

Se si desidera visualizzare i messaggi prima dell'interazione dell'utente, è possibile aggiungere "md-auto-hide = 'false'" alla direttiva ng-messages.

<div ng-messages="primaryLogin.$error" md-auto-hide='false'></div> 

ho trovato questa soluzione da: here

+0

sarebbe bello ma non aiuta. Controlla questo: http://codepen.io/anon/pen/RGRgoN. Anche se aggiungi md-auto-hide, i messaggi per e-mail non vengono visualizzati al caricamento della pagina. –

+0

Bello, grazie :) – Leasye

1

Controllare con ng-show="primaryLogin.login.$invalid && primaryLogin.login.$touched". Questo ha fatto il trucco per me.

1

Usa MD-è-error exampl:

<md-input-container md-is-error="true"> 

"Quando l'espressione data restituisce true, il contenitore di ingresso andrà in stato di errore predefiniti per erroring se l'ingresso è stato toccato ed è valido. ".

https://material.angularjs.org/1.1.3/api/directive/mdInputContainer

+0

Questo è il migliore come ng-show o ng-se crea problemi con le animazioni dei messaggi di ng. Invece di solo vero per il messaggio md-is-error se mettiamo la condizione in md-is-error funziona come un incantesimo. Grazie. –

Problemi correlati