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.
fuente
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í.compile
que 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.pagination
ejemplo, encontré este ejemplo muy útil: jsfiddle.net/EGfgHlink
opción, aún puede devolver una función en sucompile
opció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.xtrue
ofalse
como 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,@?
.link
función? Según mi comprensión, la asignación durante ellink
debe evitar un$scope.$apply()
ciclo, ¿no?Estoy usando AngularJS v1.5.10 y encontré que la
preLink
función de compilación funciona bastante bien para establecer valores de atributo predeterminados.Simplemente un recordatorio:
attrs
contiene los valores de atributo DOM sin procesar que siempre sonundefined
cadenas o.scope
contiene (entre otras cosas) los valores del atributo DOM analizados de acuerdo con la especificación de alcance de aislamiento proporcionada (=
/<
/@
/ etc.).Fragmento abreviado:
fuente