Я лише починаю з angularjs і працюю над перетворенням декількох старих плагінів JQuery в директиви Angular. Я хотів би визначити набір параметрів за замовчуванням для моєї директиви (елемента), яку можна змінити, вказавши значення параметра в атрибуті.
Я роздивився , як це робили інші, і в бібліотеці з кутом ui ui.bootstrap.pagination, здається, робить щось подібне.
Спочатку всі параметри за замовчуванням визначаються в постійному об'єкті:
.constant('paginationConfig', {
itemsPerPage: 10,
boundaryLinks: false,
...
})
Потім getAttributeValue
функція утиліти приєднується до контролера директиви:
this.getAttributeValue = function(attribute, defaultValue, interpolate) {
return (angular.isDefined(attribute) ?
(interpolate ? $interpolate(attribute)($scope.$parent) :
$scope.$parent.$eval(attribute)) : defaultValue);
};
Нарешті, це використовується у функції зв’язку для читання в атрибутах як
.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) {
...
controller: 'PaginationController',
link: function(scope, element, attrs, paginationCtrl) {
var boundaryLinks = paginationCtrl.getAttributeValue(attrs.boundaryLinks, config.boundaryLinks);
var firstText = paginationCtrl.getAttributeValue(attrs.firstText, config.firstText, true);
...
}
});
Це здається досить складним налаштуванням для чогось такого стандартного, як бажання замінити набір значень за замовчуванням. Чи є якісь інші способи зробити це загальними? Або нормально завжди визначати функцію утиліти, наприклад getAttributeValue
параметри розбору та таким чином? Мені цікаво дізнатися, які різні стратегії мають люди для цього спільного завдання.
Також як бонус мені не зрозуміло, для чого interpolate
потрібен параметр.
ui.bootstrap.pagination
все відбувається складніше? Думав, що при використанні функції компіляції будь-які зміни атрибутів, внесені пізніше, не відображатимуться, але це, мабуть, не відповідає дійсності, оскільки на цьому етапі встановлюються лише типові параметри. Зрозуміло, тут повинен бути якийсь компроміс.