app.controller('DrallCtrl', function($scope) { $scope.numbers=[0,1,2,3,4,5,6]; }); app.directive('drallRepeat', function($compile){ return { //Prioridade mais alta significa executar primeiro priority: 5000, //Impede a compilação de qualquer outra directive no primeiro pass terminal: true, compile: function(element, attrs){ //Vamos aqui adicionar ng-repeat ao dom attrs.$set('ngRepeat', attrs.myRepeat); //Acima, foi adicionado a directive ng-repeat ao elemento. //Será ignorado durante a compilação directives com prioridades 5000 ou inferiores para evitar //recursões infintas e da mesma forma, não é desejado se compilar novamente var compiled = $compile(element, null, 5000); return function(scope){ //Quando na fase de linking, apenas delega para a função de link o retorno da compilação compiled(scope); } } } })
Modo de usar:
<body ng-controller="DrallCtrl"> <ul> Esta lista foi gerada por um "drall-repeat" directive que via programação adicionou um "ng-repeat" ao elemento li. <li drall-repeat="numero in numeros">{{numero}}</li> </ul> </body>
Neste caso, este é apenas um simples uso da técnica para ilustrar como você poderia fazr.
É transformado uma directive “drall-repeat”, adicionando uma directive ‘ng-repeat’ de forma dinâmica com a mesma expressão. É possível modificar este exemplo para atender às suas necessidades, adicionando diferentes atributos a directive, dependendo dos valores de determinadas condições.
O código acima tem os seguintes benefícios:
- Nada é recompilados.
- Simplesmente é feito uma pausa compilação, altera-se o dom e, em seguida, continua-se de onde parou.
- Nenhuma manipulação louca ou clonagem de dom
- Há pessoas que tentam estas técnicas, usam funções de clones ou coisas estranhas como transclude. O dom aqui é intocável (exceto se adicionar atributos a ele)
- Atributo da directive original permanecem no dom.