לאחרונה כתבתי מערכת מבוססת אנגולר עם typescript, והייתי צריך להטמיע jquery ui datepicker, כדי לעשות זאת כתבתי directive קטן שיעזור לבצע את העבודה.
אני אציג כאן את שני הגרסאות של הקוד, אחד באנגולר רגיל והשני בעטיפה ל – typescript
אנגולר
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModelCtrl) {
element.datepicker({
isRTL: true,
dateFormat: 'dd/mm/yy',
onSelect: function (date) {
scope.$apply(function () {
ngModelCtrl.$setViewValue(date);
});
}
});
ngModelCtrl.$render = function () {
element.datepicker('setDate', ngModelCtrl.$modelValue);
};
element.datepicker('option', $.datepicker.regional['he']);
}
}
}
החלק הראשון במתודת ה – link, מטפל ביצירת האלמנט ל – datepicker, כאשר בזמן בחירת תאריך (onselect) אנחנו מעדכנים את המודל, ברישום למתודת ה – render, אנחנו דואגים לכיוון ההפוך, בזמן שינוי של המודל, אנחנו דואגים לעדכן את ה – UI.
גרסת typescript.
export class DatePickerUI implements ng.IDirective {
restrict = 'A';
require = 'ngModel';
link = (scope: ng.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, ngModelCtrl: ng.INgModelController) => {
element.datepicker({
isRTL: true,
dateFormat: 'dd/mm/yy',
onSelect: function (date) {
scope.$apply(function () {
ngModelCtrl.$setViewValue(date);
});
},
});
ngModelCtrl.$render = function () {
element.datepicker('setDate', ngModelCtrl.$modelValue);
};
element.datepicker('option', $.datepicker.regional['he']);
}
static Factory(): ng.IDirectiveFactory {
const directive = () => new DatePickerUI();
directive.$inject = [];
return directive;
}
}
angular.module('infrastructure')
.directive("datePickerUi", DatePickerUI.Factory());
}