問題を説明するために plnkr を作成しました: plnkr へのリンク
問題の説明: 数値フィールドがあり、そこから値がモデルに書き込まれます。最初に、最初の入力のようにこの機能を実装しました。この実装の問題は、何かを入力してから削除すると、次のモデルになることです。
{"firstNumber":null,"secondNumber":64}
残念ながら、この表現は受け入れられません。次の結果が必要です。
{"secondNumber":64}
そのために、ディレクティブを使用して 2 番目のフィールドを実装しました。正しい出力を受け取るようになりましたが、値を削除するとフォームが無効になります。
また、3 番目と 4 番目の入力を追加して、ディレクティブが必要な検証にも違反していることを示しました。
したがって、問題は次のとおりです。モデルを持たないように入力フィールドを改善するにはどうすればよいですか
{"firstNumber":null,"secondNumber":64}
しかし
{"secondNumber":64}
Angular フォームの検証メカニズムを壊さないでください。
参考までに:私は次のHTMLを持っています:
<body ng-controller="MainCtrl as vm">
<h1>Validating input inside ng-repeat with Angular 1.3</h1>
<form name="vm.myForm" novalidate>
<input type="number" ng-model="vm.fields.firstNumber" name="firstNumber">
<input type="number" ng-model="vm.fields.secondNumber" name="secondNumber" null-to-undefined>
<br>
<input type="number" ng-model="vm.fields.thirdNumber" name="thirdNumber" ng-required = "true">
<input type="number" ng-model="vm.fields.fourthNumber" name="fourthNumber" null-to-undefined ng-required="true">
</form>
</body>
そして、次のコントローラーとディレクティブ コード:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
var vm = this;
vm.fields = {};
vm.fields.firstNumber = 12;
vm.fields.secondNumber = 24;
vm.fields.thirdNumber = 64;
vm.fields.fourthNumber = 128;
});
app.directive('nullToUndefined', function($timeout) {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, elem, attrs, ctrl) {
ctrl.$parsers.push(function(viewValue, modelValue) {
if (viewValue === null) {
$timeout(function() {
//ctrl.$setValidity('number', true);
});
return undefined;
}
return viewValue;
});
}
};
});
psメインプロジェクトから問題を再現するために、コードを可能な限りカットしました。解決策をいただければ幸いですが、誰かが解決策を提案できれば、それは非常にクールです。1.優れたパフォーマンスを示します2.角度のある方法で動作します。