Я лише починаю з 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все відбувається складніше? Думав, що при використанні функції компіляції будь-які зміни атрибутів, внесені пізніше, не відображатимуться, але це, мабуть, не відповідає дійсності, оскільки на цьому етапі встановлюються лише типові параметри. Зрозуміло, тут повинен бути якийсь компроміс.