2016-07-13 4 views
0

入力に属性iを挿入するだけで数字や小数点を受け付けるディレクティブを作成しようとしていますが、問題は小数点以下の桁で宣言されています。

例:ユーザーはこれだけの入力がintの数値を受け入れるためにいただきました場合は は、ユーザが入力

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

ようになるだけで小数点以下の桁を望んでいる

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

ケースのようなものだろうが、今私はtypeNumとMaxDecimalPointsを$観察する必要があります、私はお互いの中で$観察を入れ子にすることができますか?どのように私は達成することができますか?ここで

は私のディレクティブです:

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

多くのことをあなただけ 'NGパターンを使用することができるとき'とパターンを変数 – charlietfl

+0

として渡しますが、検証でエラーを表示するのではなく、より多くのcharectersを挿入できるようにすることはできません。なぜng-patternを使用しなかったのでしょうか? –

+0

'maxDecimalPoints'属性は' max-decimal-points'でなければならないことに注意してください。 – charlietfl

答えて

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 

ところで、いつもparseIntまたはyou’re in for big troubleに基数の引数を追加します。余分な作業のparseInt(clean, 10)

+0

あなたはdefineがdecimalParserに関数を定義していると言ったとき、申し訳ありません。 –

+0

はい、 '$ parsers'キューのように' function intParser(val){/ * ... * /} 'を使用して定義してください。 – Iso

+0

okとparseIntについて感謝します。私の考えは、値を数値に変換することであり、ユーザーはドットまたはコンマを挿入できないので、私の場合はparseIntからNumber()関数に変更します。 –

関連する問題