2017-07-13 4 views
0

Ich brauche einen Eingangswert, der auf [1, 5000000] begrenzt ist. Ich möchte es programmatisch machen. Ich verwende AngularJS für meine Webanwendung. Hier ist der Code, den ich schrieb:Wie beschränke ich den Wert einer Eingabe mit Javascript?

html

<input ng-change="checkLimit()" type="number" min="1" max="5000000" name="input" ng-model="data.flips" required/> 

js

angular.module("app", []).controller("controller", function($scope) { 
    $scope.checkLimit = function() { 
     $scope.data.flips = $scope.data.flips > 5000000 ? 5000000 : 
     $scope.data.flips; 
     $scope.data.flips = $scope.data.flips < 1 ? 1 : $scope.data.flips; 
    } 
}); 

Ich weiß sicher, dass die Funktion ausgeführt wird, aber der Wert in das Eingabefeld und die Variable wird nicht aktualisiert. Ich bin relativ neu in Angular, also gibt es wahrscheinlich ein elementares Konzept, das ich vermisse.

+0

Haben Sie das Skript debugged, um zu sehen, was der Wert von '$ scope.data.flips' ist? –

Antwort

1

Sie müssen min entfernen und max Attribute, aufgrund dieser Validierung erlaubt nicht die ng-Modell zu ändern.

<input ng-change="checkLimit()" type="number" min="1" max="5000000" name="input" ng-model="data.flips" required 
 
          ng-model-options="{ allowInvalid: true, updateOn: 'blur' }"/>

Bitte beachte, dass wir verwenden ng-Modell-Optionen, also:

Alternative, wenn Sie die min und max halten möchten, können Sie ng-Modell-Optionen wie folgt hinzufügen wir müssen die passende eckige Version verwenden> = 1.4

+0

JIC: Es aktualisiert die Daten auf Blur-Ereignis in der Eingabe. Wenn Sie möchten, dass es sofort aktualisiert wird, entfernen Sie updateOn: 'blur' aus den ng-model-options. Aber ich denke, es ist benutzerfreundlich mit dem Onblur. – cccross

1

Edit: cccross' Antwort für eine saubere Version

Sie entkommen müssen sehen, den aktuellen Zyklus verdauen, wie ich glaube nicht, dass Winkel wird ein Element mit einem neuen Eigenschaftswert aktualisieren, wenn der Wert Eigenschaft ist aktualisiert in einem Änderungsereignis von diesem Element.

Es kann sauberere Wege geben, um das zu tun, was Sie verlangen; Dieses Beispiel funktioniert jedoch. Ich habe die Eingabeattribute 'min' und 'max' entfernt und die Änderungslogger-Logik in einen '$ timeout' -Aufruf verschoben. $ timeout ist als Controller-Argument enthalten. $ timeout wird einen weiteren Digest-Zyklus auslösen, der Ihre Eingabe aktualisiert.

angular.module("app", []).controller("controller", function($scope, $timeout) { 
    $scope.checkLimit = function() { 
     $timeout(() => { 
      $scope.data.flips = $scope.data.flips > 5000000 ? 5000000 : 
      $scope.data.flips; 
      $scope.data.flips = $scope.data.flips < 1 ? 1 : $scope.data.flips; 
     }) 
    } 
}); 

fiddle

+0

Siehe meine Antwort für eine sauberere Lösung – cccross

+0

Ich glaube nicht, dass Ihre Antwort richtig ist - Ihre Antwort kann den im Eingabeelement angezeigten Wert nicht aktualisieren. http://jsfiddle.net/xaxwaudv/4/ –

+0

Es funktioniert. Es aktualisiert die Daten des Blur-Ereignisses in der Eingabe. Wenn Sie möchten, dass es sofort aktualisiert wird, entfernen Sie updateOn: 'blur' aus den ng-model-options. Aber ich denke, es ist benutzerfreundlich mit dem Onblur. – cccross

Verwandte Themen