Eu tenho uma versão muito resumida do que estou fazendo que esclarece o problema.
Eu tenho um simples directive
. Sempre que você clica em um elemento, ele adiciona outro. No entanto, ele precisa ser compilado primeiro para renderizá-lo corretamente.
Minha pesquisa me levou a $compile
. Mas todos os exemplos usam uma estrutura complicada que eu realmente não sei como aplicar aqui.
Os violinos estão aqui: http://jsfiddle.net/paulocoelho/fBjbP/1/
E o JS está aqui:
var module = angular.module('testApp', [])
.directive('test', function () {
return {
restrict: 'E',
template: '<p>{{text}}</p>',
scope: {
text: '@text'
},
link:function(scope,element){
$( element ).click(function(){
// TODO: This does not do what it's supposed to :(
$(this).parent().append("<test text='n'></test>");
});
}
};
});
Solução de Josh David Miller: http://jsfiddle.net/paulocoelho/fBjbP/2/
$compile
? Obrigado pela sua resposta, a propósito!$compile
serviço é o que liga as diretivas e as conecta ao ciclo de eventos. Não há como contornar$compile
uma situação como essa, mas na maioria dos casos outra diretiva como o ngRepeat pode realizar o mesmo trabalho (portanto, o ngRepeat está fazendo a compilação para nós). Você tem um caso de uso específico?Além do exemplo perfeito de Riceball LEE de adicionar uma nova diretiva de elemento
A adição de uma nova diretiva de atributo ao elemento existente pode ser feita desta maneira:
Digamos que você deseja adicionar on-the-fly
my-directive
aospan
elemento.Espero que ajude.
fonte
Maximum call stack size exceeded
erro sempre acontece devido a uma recursão infinita. Nunca vi um caso em que o aumento do tamanho da pilha o resolvesse.A adição dinâmica de diretivas em angularjs possui dois estilos:
Adicionar uma diretiva angularjs a outra diretiva
inserindo um novo elemento (diretiva)
é simples. E você pode usar em "link" ou "compilar".
inserindo um novo atributo no elemento
É difícil e me dá dor de cabeça em dois dias.
Usar "$ compile" irá gerar um erro recursivo crítico !! Talvez deva ignorar a diretiva atual ao recompilar o elemento.
Então, eu tenho que encontrar uma maneira de chamar a função "link" da diretiva. É muito difícil obter os métodos úteis que estão ocultos profundamente nos fechamentos.
Agora, funciona bem.
fonte
fonte
A resposta aceita por Josh David Miller funciona muito bem se você estiver tentando adicionar dinamicamente uma diretiva que usa uma linha
template
. No entanto, se a sua diretiva tirar proveito datemplateUrl
resposta dele, não funcionará. Aqui está o que funcionou para mim:fonte
Josh David Miller está correto.
PCoelho, Caso esteja se perguntando o que
$compile
acontece nos bastidores e como a saída HTML é gerada a partir da diretiva, dê uma olhada abaixoO
$compile
serviço compila o fragmento de HTML ("< test text='n' >< / test >"
) que inclui a diretiva ("teste" como um elemento) e produz uma função. Essa função pode ser executada com um escopo para obter a "saída HTML de uma diretiva".Mais detalhes com exemplos de código completo aqui: http://www.learn-angularjs-apps-projects.com/AngularJs/dynamically-add-directives-in-angularjs
fonte
Inspirado em muitas das respostas anteriores, criei a seguinte diretiva "stroman" que se substituirá a qualquer outra diretiva.
Importante: Registre as diretivas que você deseja usar
restrict: 'C'
. Como isso:Você pode usar assim:
Para conseguir esta:
Protip. Se você não quiser usar diretivas baseadas em classes, poderá mudar
'<div></div>'
para o que quiser. Por exemplo, tenha um atributo fixo que contenha o nome da diretiva desejada em vez declass
.fonte