Я только начинаю с angularjs и работаю над преобразованием нескольких старых плагинов JQuery в директивы Angular. Я бы хотел определить набор параметров по умолчанию для моей директивы (element), который можно переопределить, указав значение параметра в атрибуте.
Я оглянулся на то, как это сделали другие, и в библиотеке 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
все сложнее? Думал, что если использовать функцию компиляции, любые изменения атрибутов, сделанные позже, не будут отражены, но это не похоже на правду, так как на этом этапе устанавливаются только значения по умолчанию. Думаю, здесь должен быть какой-то компромисс.