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 getAttributeValuese 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 getAttributeValuey 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é interpolatese requiere el parámetro.
fuente

ui.bootstrap.paginationcosas 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í.compileque no puede leer los atributos, que deben interpolarse para obtener valor (que contiene expresión). Pero si desea verificar solo si el atributo está vacío, funcionará sin compensaciones para usted (antes de que el atributo de interpolación contenga una cadena con expresión).ui.bootstrap.paginationejemplo, encontré este ejemplo muy útil: jsfiddle.net/EGfgHlinkopción, aún puede devolver una función en sucompileopción. doc hereattributes.foo = '["one", "two", "three"]'lugar deattributes.foo = ["one", "two", "three"]Use la
=?bandera para la propiedad en el bloque de alcance de la directiva.fuente
=?está disponible desde 1.1.xtrueofalsecomo valores, (creo) querría usar, por ejemplo, en su$scope.hasName = angular.isDefined($scope.hasName) ? $scope.hasName : false;lugar.=?, pero no con la unión de una sola vía,@?.linkfunción? Según mi comprensión, la asignación durante ellinkdebe evitar un$scope.$apply()ciclo, ¿no?Estoy usando AngularJS v1.5.10 y encontré que la
preLinkfunción de compilación funciona bastante bien para establecer valores de atributo predeterminados.Simplemente un recordatorio:
attrscontiene los valores de atributo DOM sin procesar que siempre sonundefinedcadenas o.scopecontiene (entre otras cosas) los valores del atributo DOM analizados de acuerdo con la especificación de alcance de aislamiento proporcionada (=/</@/ etc.).Fragmento abreviado:
fuente