Estoy comenzando con angularjs, y estoy trabajando en convertir algunos viejos complementos de JQuery a directivas angulares. Me gustaría definir un conjunto de opciones predeterminadas para mi directiva (elemento), que se puede anular especificando el valor de la opción en un atributo.
He echado un vistazo a la forma en que otros lo han hecho, y en la biblioteca angular-ui , la ui.bootstrap.pagination parece hacer algo similar.
Primero, todas las opciones predeterminadas se definen en un objeto constante:
.constant('paginationConfig', {
itemsPerPage: 10,
boundaryLinks: false,
...
})
Luego getAttributeValue
se adjunta una función de utilidad al controlador de la directiva:
this.getAttributeValue = function(attribute, defaultValue, interpolate) {
return (angular.isDefined(attribute) ?
(interpolate ? $interpolate(attribute)($scope.$parent) :
$scope.$parent.$eval(attribute)) : defaultValue);
};
Finalmente, esto se usa en la función de enlace para leer atributos como
.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);
...
}
});
Esto parece una configuración bastante complicada para algo tan estándar como querer reemplazar un conjunto de valores predeterminados. ¿Hay otras formas de hacer esto que sean comunes? ¿O es normal definir siempre una función de utilidad como getAttributeValue
y analizar opciones de esta manera? Me interesa saber qué estrategias diferentes tienen las personas para esta tarea común.
Además, como beneficio adicional, no estoy claro por qué interpolate
se requiere el parámetro.
ui.bootstrap.pagination
cosas son más complicadas? Estaba pensando que si se usa la función de compilación, cualquier cambio de atributo realizado más tarde no se reflejaría, pero esto no parece ser cierto ya que solo los valores predeterminados se establecen en esta etapa. Supongo que debe haber algún compromiso aquí.