personalizadas example directivas crear angularjs templates angularjs-directive uniqueidentifier

angularjs - example - Id. Únicos de plantilla de directiva para elementos



ngfor angular 4 example (4)

ACTUALIZAR

Angular 1.3 introdujo una unión nativa perezosa de una sola vez. de la documentación de expresión angular :

Encuadernación de una sola vez

Una expresión que comienza con :: se considera una expresión de una sola vez. Las expresiones únicas dejarán de recalcular una vez que estén estables, lo que sucede después del primer resumen si el resultado de la expresión es un valor no indefinido (consulte el algoritmo de estabilización de valores a continuación).

Solución nativa :

.directive(''myDirective'', function() { var uniqueId = 1; return { restrict: ''E'', scope: true, template: ''<input type="checkbox" id="{{::uniqueId}}"/>'' + ''<label for="{{::uniqueId}}">open</label>'', link: function(scope, elem, attrs) { scope.uniqueId = ''item'' + uniqueId++; } } })

Solo ata una vez:

  • Si solo necesita vincular un valor una vez que no debe usar enlaces ({{}} / ng-bind)
  • los enlaces son caros porque usan $ watch. En su ejemplo, en cada $ digest, angular dirty comprueba sus ID para ver los cambios, pero solo los establece una vez.
  • Verifique este módulo: https://github.com/Pasvaz/bindonce

Solución:

.directive(''myDirective'', function() { var uniqueId = 1; return { restrict: ''E'', scope: true, template: ''<input type="checkbox"/><label>open</label>'', link: function(scope, elem, attrs) { var item = ''item'' + uniqueId++; elem.find(''input'').attr(''id'' , item); elem.find(''label'').attr(''for'', item); } } })

Tengo una directiva que puede usarse varias veces en una página. En la plantilla de esta directiva, necesito usar identificadores para un elemento de entrada para poder "enlazar" una etiqueta como así:

<input type="checkbox" id="item1" /><label for="item1">open</label>

Ahora el problema es que, tan pronto como mi directiva se incluye varias veces, el ID "elemento1" ya no es único y la etiqueta no funciona correctamente (debe marcar / desmarcar la casilla cuando se haga clic).

¿Cómo se soluciona este problema? ¿Hay alguna manera de asignar un "espacio de nombres" o "prefijo" para la plantilla (como asp.net hace con el ctl00 ...- Prefijo)? O tengo que incluir una expresión angular en cada id-atributo que consta de la directiva-ID del alcance + una identificación estática. Algo como:

<input type="checkbox" id="{{directiveID}} + ''item1''" /><label for="{{directiveID}} + ''item1''">open</label>

Editar:

Mi directriz

module.directive(''myDirective'', function () { return { restrict: ''E'', scope: true, templateUrl: ''partials/_myDirective.html'', controller: [''$scope'', ''$element'', ''$attrs'', function ($scope, $element, $attrs) { ... } //controller }; }]);

Mi HTML

<div class="myDirective"> <input type="checkbox" id="item1" /><label for="item1">open</label> </div>


Además de las soluciones de Ilan y BuriB (que son más genéricas, lo cual es bueno), encontré una solución a mi problema específico porque necesitaba ID para el atributo "para" de la etiqueta. En su lugar, se puede usar el siguiente código:

<label><input type="checkbox"/>open</label>

El siguiente -Post ha ayudado:

https://.com/a/14729165/1288552


Agregamos un parámetro BlockId al alcance, porque usamos el id en nuestras pruebas de Selenium, por ejemplo. Todavía existe la posibilidad de que no sean únicos, pero preferimos tener un control total sobre ellos. Otra ventaja es que podemos darle al objeto una identificación más descriptiva.

Directiva JS

module.directive(''myDirective'', function () { return { restrict: ''E'', scope: { blockId: ''@'' }, templateUrl: ''partials/_myDirective.html'', controller: [''$scope'', ''$element'', ''$attrs'', function ($scope, $element, $attrs) { ... } //controller }; }]);

Directiva HTML

<div class="myDirective"> <input type="checkbox" id="{{::blockId}}_item1" /><label for="{{::blockId}}_item1">open</label> </div>

Uso

<my-directive block-id="descriptiveName"></my-directive>


HTML

<div class="myDirective"> <input type="checkbox" id="myItem_{{$id}}" /> <label for="myItem_{{$id}}">open myItem_{{$id}}</label> </div>