次のようなディレクティブを定義しました。
angular.module('MyModule', [])
.directive('datePicker', function($filter) {
return {
require: 'ngModel',
link: function(scope, elem, attrs, ctrl) {
ctrl.$formatters.unshift(function(modelValue) {
console.log('formatting',modelValue,scope,elem,attrs,ctrl);
return $filter('date')(modelValue, 'MM/dd/yyyy');
});
ctrl.$parsers.unshift(function(viewValue) {
console.log('parsing',viewValue);
var date = new Date(viewValue);
return isNaN(date) ? '' : date;
});
}
}
});
ただし、テキストボックスにキーを入力するたびにパーサーが起動するようです-デフォルトのイベントは正確には何keyup
ですかinput
? そして、それを唯一の火に変更するにはどうすればよいonchange
ですか?それ以上頻繁に発砲する必要はありません。
さらに、jQuery UI の datepicker を使用して、この入力の内容を実際に操作しています。カレンダーをクリックしても、モデルの更新/パーサーのトリガーを引き起こす適切なイベントがトリガーされないようです。イベントを強制的に発生させることができると思います が、どれを知る必要があります。
使用しようとしていますscope.$apply()
が、それは何の役にも立たないようです:
.directive('datepicker', function($filter) {
return {
require: 'ngModel',
link: function(scope, elem, attrs, ctrl) {
$(elem).datepicker({
onSelect: function(dateText, inst) {
console.log(dateText, inst);
scope.$apply();
}
});
ctrl.$formatters.unshift(function(modelValue) {
console.log('formatting',modelValue);
return $filter('date')(modelValue, attrs.datePicker || 'MM/dd/yyyy');
});
ctrl.$parsers.unshift(function(viewValue) {
console.log('parsing',viewValue);
return new Date(viewValue);
});
}
}
})
(a) 日付形式またはその他のオプションを選択するために datepicker 属性値を使用したいが、さらに重要なのは、(b) 文字列を実際の日付オブジェクトが必要な場合のモデル...そのため、何らかの形式の解析を実行してに適用する必要がありng-model
ます.