2016-12-03 7 views
0

私は以下の入力を持っています(ng-repeatで入れ子になっています)。ng-listは文字列ではなく数値の配列を返すことができますか?

<input ng-model="event.days" ng-list required> 

問題は、ユーザが、この入力の値を編集するたびに(例えば、変化、である:整数のアレイから

1, 2 

1, 2, 3 
に配列変更、 like

[1, 2, 3] 

文字列の配列へ

["1", "2", "3"] 

これはng-listが行うことをドキュメントで明確に示しています。私はちょうどこの問題のための最も激しい回避策が何であるか疑問に思っています。私は既に追加しようとしました:

ng-change="event.days = event.days.map(parseInt);" 

しかし、それはうまくいきませんでした。

答えて

0

をお使いのはintListディレクティブを言うと、ちょうどそこparseInt機能を追加してみましょう。

app.directive('intList', function() { 
    return { 
    restrict: 'A', 
    priority: 100, 
    require: 'ngModel', 
    link: function(scope, element, attr, ctrl) { 
     var ngList = attr.ngList || ', '; 
     var trimValues = attr.ngTrim !== 'false'; 
     var separator = trimValues ? ngList.trim() : ngList; 

     var parse = function(viewValue) { 
     // If the viewValue is invalid (say required but empty) it will be `undefined` 
     if (!angular.isDefined(viewValue)) return; 

     var list = []; 

     if (viewValue) { 
      angular.forEach(viewValue.split(separator), function(value) { 
      if (value) list.push(parseInt(trimValues ? value.trim() : value)); 
      }); 
     } 

     return list; 
     }; 

     ctrl.$parsers.push(parse); 
     ctrl.$formatters.push(function(value) { 
     if (angular.isArray(value)) { 
      return value.join(ngList); 
     } 

     return undefined; 
     }); 

     // Override the standard $isEmpty because an empty array means the input is empty. 
     ctrl.$isEmpty = function(value) { 
     return !value || !value.length; 
     }; 
    } 
    }; 
}); 

plunker: http://plnkr.co/edit/mEBm05gnfyM03xy9QlZh?p=preview

+0

これは完全に機能します。私は、クローン作成/ ng-listのカスタマイズを考えたことはありませんでした! – Nick

0

ng-listの動作ではありません。 inputの値は常に文字列ですので、これはevent.daysになります。

あなたはいつものようないくつかの解析を行うことができ

:あなたがngListのクローンを作成することができます

daysArray = daysString.split("\\s+").map(day => parseInt(day, 10)) 
+0

ああ私は理解しています!しかし、どこに私はそれのようなものを置くことができますか?それは変化には作用しません。 – Nick

関連する問題