2014-04-10 3 views
13

Vorrei verificare un campo di input per i numeri delle carte di credito.Come impostare un campo di input per ng-invalid in angularJS

Il campo deve rimanere invalido finché non ha una lunghezza minima di 13. Poiché l'utente deve essere in grado di riempire lo spazio nel campo, rimuovo quegli spazi all'interno di una funzione javascript. In questa funzione vorrei controllare il numero della carta di credito (senza spazi) e impostarlo su ng-invalid fintanto che la lunghezza minima è minore di 13 e la lunghezza massima è maggiore di 16.

Dovrebbe essere qualcosa di simile:

$scope.ccHandler = function() { 
    if ($scope.ccNumber == '') { 
     document.getElementById("ccProvider").disabled = false; 
    } 
    $scope.ccNumber = inputCC.value.split(' ').join(''); //entfernt die Leerzeichen aus der Kreditkartennummer vor der übergabe an den Server 
    console.log("das ist meine CC: " + $scope.ccNumber); 
    isValidCreditCardNumber($scope.ccNumber); 
    getCreditCardProvider($scope.ccNumber); 
    document.getElementById("ccProvider").disabled = true; 
    if ($scope.ccNumber.length < creditCardNumberMinLength || $scope.ccNumber.length > creditCardNumberMaxLength) { 
     //$scope.ccNumber.ng-invalid = true; 
     console.log("ccNumber ist noch ungültig!"); 
     //document.getElementById("inputCC").$setValidity("ccNumber", false); 
    } 
} 

questa sarebbe la parte del XHTML:

<div class="form-group" ng-switch-when="CreditCard"> 
    <label class="col-xs-3 col-sm-3 control-label">Kreditkartennummer</label> 
    <div class="col-xs-5 col-sm-5 col-md-5"> 
     <input name="ccNumber" class="form-control" type="text" id="inputCC" ng-change="ccHandler();updateCount()" ng-model="ccNumber" ng-required="true"/> 
    </div> 
</div> 

Come posso raggiungere questo obiettivo?

+0

Utilizzare 'ng -disabled' invece di 'document.getElementById (" ccProvider "). disabled' –

+1

Si potrebbe voler ck out la direttiva mask di ui angolare: http://angular-ui.github.io/ui-utils/#/mask –

risposta

15

Il seguente codice ha funzionato per me:

$scope.myForm.ccNumber.$setValidity("ccNumber", false); 
+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). – Steve

+4

Questa è una risposta al mio post in quanto raggiunge quello che ho cercato. – Pille

+0

Hai ragione, non ho usato $ setValidity correttamente. Ho modificato la mia risposta. –

4

È possibile utilizzare gli attributi standard ng-maxlength e ng-minlength nel campo di input.

C'è un esempio di lavoro nello AngularJS docs.

<input type="text" name="lastName" ng-model="user.last" 
    ng-minlength="3" ng-maxlength="10"> 
+0

Grazie, ma che non posso usare come spazi vengono rimossi all'interno di quel campo di input (come ho detto sopra). Devo monitorare la lunghezza all'interno di una funzione JS. Ho modificato la mia domanda per renderla più chiara. – Pille

+0

Perché non puoi rimuovere gli spazi e lasciare che le direttive standard ne stabiliscano la validità? –

+0

Gli spazi vengono rimossi ma l'input effettivo all'interno del campo viene osservato da ng-minlength e ng-maxlength e non dai dati modificati senza spazi. Quindi il problema è che questi spazi sono presi in considerazione quando si controlla la lunghezza minima e massima. – Pille

29

È possibile farlo con $setValidity. È necessario impostare un attributo name su <form> affinché funzioni.

<form name="myForm"> 
    <input name="ccNumber" ng-model="ccNumber"> 
    <span ng-show="myForm.ccNumber.$error.minLength"> 
     A cc number should be minimum 10 chars 
    </span> 
</form> 

Quindi è possibile impostare manualmente la validità con

$scope.myForm.ccNumber.$setValidity("minLength",$scope.ccNumber.length>=10); 

Ecco un plnkr di lavoro: http://plnkr.co/edit/7J326LR194SaoE2TmHuU?p=preview

+0

Grazie per quello. In qualche modo, impostare la validità in questo modo viene in qualche modo ignorato. Non so perché. Il campo di input è all'interno di un div e questo div è all'interno del modulo. Dovrebbe essere ok, non è così? – Pille

+0

Come posso vedere hai aggiornato la domanda corrispondente alla mia risposta ... – Pille