Je commence juste avec angularjs et je travaille sur la conversion de quelques anciens plugins JQuery en directives Angular. Je voudrais définir un ensemble d'options par défaut pour ma directive (élément), qui peut être remplacée en spécifiant la valeur d'option dans un attribut.
J'ai jeté un coup d'œil à la manière dont d'autres ont fait cela, et dans la bibliothèque angular-ui , ui.bootstrap.pagination semble faire quelque chose de similaire.
Tout d'abord, toutes les options par défaut sont définies dans un objet constant:
.constant('paginationConfig', {
itemsPerPage: 10,
boundaryLinks: false,
...
})
Ensuite, une getAttributeValue
fonction utilitaire est attachée au contrôleur de directive:
this.getAttributeValue = function(attribute, defaultValue, interpolate) {
return (angular.isDefined(attribute) ?
(interpolate ? $interpolate(attribute)($scope.$parent) :
$scope.$parent.$eval(attribute)) : defaultValue);
};
Enfin, cela est utilisé dans la fonction de liaison pour lire les attributs comme
.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);
...
}
});
Cela semble être une configuration assez compliquée pour quelque chose d'aussi standard que de vouloir remplacer un ensemble de valeurs par défaut. Existe-t-il d'autres moyens de le faire qui sont courants? Ou est-il normal de toujours définir une fonction utilitaire telle que getAttributeValue
et analyser les options de cette manière? Je suis intéressé de savoir quelles sont les différentes stratégies des gens pour cette tâche commune.
De plus, en prime, je ne sais pas pourquoi le interpolate
paramètre est requis.
ui.bootstrap.pagination
choses sont-elles plus compliquées? Je pensais que si vous utilisiez la fonction de compilation, les modifications d'attribut apportées ultérieurement ne seraient pas reflétées, mais cela ne semble pas être vrai car seules les valeurs par défaut sont définies à ce stade. Je suppose qu'il doit y avoir un compromis à faire ici.