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.
la source
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.compile
vous ne pouvez pas lire les attributs, qui doivent être interpolés pour obtenir une valeur (qui contient une expression). Mais si vous voulez vérifier uniquement si l'attribut est vide - cela fonctionnera sans compromis pour vous (avant que l'attribut d'interpolation contienne une chaîne avec une expression).ui.bootstrap.pagination
exemple, j'ai trouvé cet exemple très utile: jsfiddle.net/EGfgHlink
option, vous pouvez toujours renvoyer une fonction dans votrecompile
option. doc hereattributes.foo = '["one", "two", "three"]'
place deattributes.foo = ["one", "two", "three"]
Utilisez l'
=?
indicateur de la propriété dans le bloc de portée de la directive.la source
=?
est disponible depuis 1.1.xtrue
oufalse
comme valeurs, vous voudriez (je pense) utiliser par exemple à la$scope.hasName = angular.isDefined($scope.hasName) ? $scope.hasName : false;
place.=?
, mais pas avec la liaison à sens unique ,@?
.link
fonction? D'après ce que j'ai compris, l'attribution pendant lelink
devrait éviter un$scope.$apply()
cycle, n'est-ce pas?J'utilise AngularJS v1.5.10 et j'ai trouvé que la
preLink
fonction de compilation fonctionnait plutôt bien pour définir les valeurs d'attribut par défaut.Juste un rappel:
attrs
contient les valeurs d'attribut DOM brutes qui sont toujours desundefined
chaînes ou des chaînes.scope
contient (entre autres) les valeurs d'attribut DOM analysées conformément à la spécification de portée d'isolat fournie (=
/<
/@
/ etc.).Extrait abrégé:
la source