2016-07-13 6 views
0

Ich versuche, eine Direktive zu erstellen, die nur Zahlen oder Dezimalzahlen abhängig von dem Attribut akzeptiert, das ich in meine Eingabe einfüge, das Problem ist mit der Deklaration der Dezimalstellen.

Beispiel: Wenn ein Benutzer was nur dieser Eingang int Zahlen enthält, ist es wie

<input only-number type-num="int"> 

Fall wäre der Benutzer nur Dezimalstellen die Eingabe wie

<input only-number type-num="decimal" maxDecimalPoints="2"> 

wäre aber jetzt muss ich $Num und MaxDecimalPoints beobachten, kann ich $ ineinander beobachten beobachten? Wie kann ich es schaffen?

Hier ist meine Richtlinie:

angular.module('app') 
    .directive('onlyNumber', function(){ 
     return { 
      require: '?ngModel', 
      link: function(scope, element, attrs, ngModelCtrl) { 
       if(!ngModelCtrl) { 
        return; 
       } 

       // Only Int Numbers 
       attrs.$observe('typeNum', function(value){ 

        if(value == "int"){ 
         ngModelCtrl.$parsers.push(function(val) { 
          if (angular.isUndefined(val)) { 
           var val = ''; 
          } 
          var clean = val.replace(/[^0-9]+/g, ''); 
          if (val !== clean) { 
           ngModelCtrl.$setViewValue(clean); 
           ngModelCtrl.$render(); 
          } 
          return parseInt(clean); 
         }); 
        } 

       }); 

       // Only Decimal 
       attrs.$observe('typeNum', function(value){ 

        if(value == "decimal"){ 

         // Now Check limit of decimal places 

        } 

       }); 


       element.bind('keypress', function(event) { 
        if(event.keyCode === 32) { 
         event.preventDefault(); 
        } 
       }); 
      } 
     }; 
    }); 
+0

viel zusätzliche Arbeit, wenn Sie gerade 'ng-Muster verwenden könnte 'und übergeben Muster als Variable – charlietfl

+0

, aber die Idee ist nicht, Fehler in der Validierung zu zeigen, ist nicht in der Lage, den Benutzer in der Lage, mehr Buchstaben einfügen, warum ich nicht ng-Muster verwendet und auch, weil in der Lage, mehr Verhaltensweisen zu implementieren –

+0

Beachten Sie, dass 'maxDecimalPoints' Attribut 'max-Dezimal-Punkte' sein muss – charlietfl

Antwort

1
var parser; 

attrs.$observe('typeNum', function (typeNum) { 
    if (parser) { 
    ngModelCtrl.$parsers.splice(ngModelCtrl.$parsers.indexOf(parser), 1); 
    } 

    switch (typeNum) { 
    case 'int': 
     parser = intParser; 
     break; 

    case 'decimal': 
     parser = decimalParser; 
     break; 

    default: 
     return; 
    } 

    ngModelCtrl.$parsers.push(parser); 
}); 

// define intParser and decimalParser here 

By the way, fügen Sie immer eine Radix Argument parseInt oder you’re in for big trouble: parseInt(clean, 10)

+0

Entschuldigung für die dumme Frage, wenn Sie sagen, definieren definiert eine Funktion zu decimalParser? –

+0

Ja, benutze 'function intParser (val) {/ * ... * /}', um sie zu definieren anstatt sie zu addieren wie in der '$ parsers'-Warteschlange – Iso

+0

ok, und danke über parseInt, von dem ich keine Ahnung hatte In meinem Fall wechsle ich von parseInt in Number() -Funktion, da meine Idee ist, den Wert in eine Zahl zu konvertieren und auch der Benutzer ist nicht in der Lage, Punkte oder Kommas –