私の目標は、入力マスクも持つUI Bootstrapのdatepickerを作成することです。
datepicker
ディレクティブは、ユーザーが手動で入力する日付ではなく、ポップアップウィンドウで選択した日付のみを検証するため、テキスト入力の場合はhow to add custom validationを検索しました。
私はこれをすべて持っていますworking in this Plunkです。ここで
は重要なビットです:
<!-- HTML -->
<span>Errors: {{myForm.myDate.$error}}</span>
<input
name="myDate"
type="text"
class="form-control"
ng-class="{error: myForm.myDate.$invalid && myForm.myDate.$dirty}"
datepicker-popup="MM/dd/yyyy"
ng-model="dt"
is-open="opened"
min-date="'09/01/2015'"
max-date="'11/11/2015'"
ng-required="true"
show-weeks="false"
show-button-bar="false" />
// JavaScript
.controller('DatepickerDemoCtrl', function ($scope) {
$scope.dt = undefined;
$scope.open = function($event) {
$scope.opened = !$scope.opened;
};
$scope.today = new Date();
})
.config(function($provide) {
$provide.decorator('datepickerPopupDirective', function($delegate) {
var directive = $delegate[0];
var link = directive.link;
directive.compile = function() {
return function(scope, iEl, iAttrs, ctrls) {
link.apply(this, arguments);
// use custom validator to enforce date range on hand-entered text
ctrls[0].$validators.inDateRange = function(modelValue, viewValue) {
console.log(modelValue, viewValue);
// use the ranges provided in the attributes for the validation
var enteredDate = new Date(viewValue)
, min = new Date(iAttrs.minDate)
, max = new Date(iAttrs.maxDate);
return ctrls[0].$isEmpty(modelValue)
|| (min <= enteredDate && enteredDate <= max);
};
// apply input mask to the text field
iEl.mask('99/99/9999');
};
};
return $delegate;
});
});
は今、私は私がモデルにそれを永続化する前に、値のいくつかの作業を行うことができますので、私の入力にgetterSetter
を追加しているシンプルなものを、やってみたいです。
私の要素のng-model
が変更されます。ng-model-options
を追加してgetterSetter
を参照し、実際のgetterSetter
メソッドを追加してください。基本的に何もしないでもthis simple Plunk withgetterSetter
しかし
<!-- HTML -->
ng-model="getSetDate"
ng-model-options="{getterSetter: true}"
// JavaScript
$scope.getSetDate = function(val) {
if(angular.isDefined(val)) {
$scope.dt = val;
} else {
return val;
}
};
は、エラーを紹介します。私がいる場合:無効な日に
- タイプは、(入力)の有効な日に、それ
09/10/2011
- 正しいと言う、値が消え
09/10/2015
- を言う
私は理解できませんなぜこの単純な紹介getterSetter
が私の価値を失う原因になっているのでしょうか。これを別の方法で実装する必要がありますか?
おそらく、datepickerディレクティブはngModelOptionsを無視します。 datepickerは単一の文字列を保存しないことを忘れないでください。彼らはいくつかの元のルールを変更することができます –