Ho appena iniziato con angularjs e sto lavorando alla conversione di alcuni vecchi plugin JQuery in direttive angolari. Vorrei definire un set di opzioni predefinite per la mia direttiva (elemento), che può essere sovrascritto specificando il valore dell'opzione in un attributo.
Ho dato un'occhiata al modo in cui altri lo hanno fatto, e nella libreria angular -ui la ui.bootstrap.pagination sembra fare qualcosa di simile.
Innanzitutto tutte le opzioni predefinite sono definite in un oggetto costante:
.constant('paginationConfig', {
itemsPerPage: 10,
boundaryLinks: false,
...
})
Quindi una getAttributeValue
funzione di utilità è collegata al controller della direttiva:
this.getAttributeValue = function(attribute, defaultValue, interpolate) {
return (angular.isDefined(attribute) ?
(interpolate ? $interpolate(attribute)($scope.$parent) :
$scope.$parent.$eval(attribute)) : defaultValue);
};
Infine, questo viene utilizzato nella funzione di collegamento per leggere gli attributi come
.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);
...
}
});
Sembra una configurazione piuttosto complicata per qualcosa di standard come voler sostituire un set di valori predefiniti. Ci sono altri modi per farlo che sono comuni? Oppure è normale definire sempre una funzione di utilità come getAttributeValue
e analizzare le opzioni in questo modo? Sono interessato a scoprire quali diverse strategie hanno le persone per questo compito comune.
Inoltre, come bonus, non sono chiaro il motivo per cui il interpolate
parametro è richiesto.
ui.bootstrap.pagination
cose in un modo più complicato? Stavo pensando che se si utilizza la funzione di compilazione le modifiche agli attributi apportate in un secondo momento non verrebbero riflesse, ma ciò non sembra essere vero poiché solo i valori predefiniti sono impostati in questa fase. Immagino che qui ci sia un certo compromesso.