134

Я только начинаю с angularjs, и я работаю над преобразованием нескольких старых плагинов JQuery в Angular директивы. Я хотел бы определить набор параметров по умолчанию для моей (элемента) директивы, которые можно переопределить, указав значение параметра в атрибуте.Угловая директива с настройками по умолчанию

У меня был взгляд вокруг, как это сделали другие, и в библиотеке angular-uiui.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.

ответ

102

Функция compile Функция - читать атрибуты, если они не установлены - заполнить их значениями по умолчанию.

.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) { 
    ... 
    controller: 'PaginationController', 
    compile: function(element, attrs){ 
     if (!attrs.attrOne) { attrs.attrOne = 'default value'; } 
     if (!attrs.attrTwo) { attrs.attrTwo = 42; } 
    }, 
     ... 
    } 
}); 
+1

Спасибо! Итак, любые мысли о том, почему 'ui.bootstrap.pagination' делает вещи сложнее? Думал, что если использовать функцию компиляции, любые изменения атрибутов, сделанные позже, не будут отражены, но это не выглядит так, как только на этом этапе устанавливаются только значения по умолчанию. Угадайте, что здесь должны быть некоторые компромиссы. –

+3

@KenChatfield в 'compile' вы не можете читать атрибуты, которые должны быть интерполированы для получения значения (которое содержит выражение). Но если вы хотите проверить, только если атрибут пуст, он будет работать без каких-либо компромиссов для вас (до того как атрибут интерполяции будет содержать строку с выражением). –

+1

Фантастический! Большое спасибо за ваше четкое объяснение. Для будущих читателей, хотя и касательно исходного вопроса, для объяснения того, что делает параметр интерполяции в примере 'ui.bootstrap.pagination', я нашел этот очень полезный пример: http://jsfiddle.net/EGfgH/ –

247

Используйте флаг =? для свойства в блоке области действия директивы.

angular.module('myApp',[]) 
    .directive('myDirective', function(){ 
    return { 
     template: 'hello {{name}}', 
     scope: { 
     // use the =? to denote the property as optional 
     name: '=?' 
     }, 
     controller: function($scope){ 
     // check if it was defined. If not - set a default 
     $scope.name = angular.isDefined($scope.name) ? $scope.name : 'default name'; 
     } 
    } 
    }); 
+4

'=?' ' доступно с 1.1.x –

+33

Если ваш атрибут может принимать значения «true» или «false» в качестве значений, вы бы (я думаю) хотели бы использовать, например, '$ scope.hasName = angular.isDefined ($ scope.hasName)? $ scope.hasName: false; вместо этого. –

+0

Вау, это действительно чистое решение. Не удалось найти такой хороший пример использования значений по умолчанию для Угловых документов. +1! –

Смежные вопросы