Tengo una versión muy resumida de lo que estoy haciendo que resuelve el problema.
Tengo un simple directive
. Cada vez que hace clic en un elemento, agrega otro. Sin embargo, debe compilarse primero para representarlo correctamente.
Mi investigación me llevó a $compile
. Pero todos los ejemplos usan una estructura complicada que realmente no sé cómo aplicar aquí.
Los violines están aquí: http://jsfiddle.net/paulocoelho/fBjbP/1/
Y el JS está aquí:
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>");
});
}
};
});
Solución de Josh David Miller: http://jsfiddle.net/paulocoelho/fBjbP/2/
$compile
? Gracias por tu respuesta por cierto!$compile
servicio es lo que conecta las directivas y las conecta al ciclo de eventos. No hay forma de evitar$compile
una situación como esta, pero en la mayoría de los casos otra directiva como ngRepeat puede realizar el mismo trabajo (por lo que ngRepeat está compilando por nosotros). ¿Tiene un caso de uso específico?Además de perfeccionar el ejemplo de Riceball LEE de agregar una nueva directiva de elemento
Se puede agregar una nueva directiva de atributo al elemento existente de esta manera:
Digamos que desea agregar sobre la marcha
my-directive
alspan
elemento.Espero que ayude.
fuente
Maximum call stack size exceeded
error siempre ocurre debido a la recursión infinita. Nunca he visto una instancia en la que aumentar el tamaño de la pila lo resolvería.Agregar dinámicamente directivas en angularjs tiene dos estilos:
Agregar una directiva angularjs a otra directiva
insertar un nuevo elemento (directiva)
es sencillo. Y se puede usar en "enlace" o "compilar".
insertando un nuevo atributo al elemento
Es difícil y me da dolor de cabeza en dos días.
¡Usar "$ compile" generará un error recursivo crítico! Tal vez debería ignorar la directiva actual al volver a compilar el elemento.
Por lo tanto, tengo que encontrar una manera de llamar a la función directiva "enlace". Es muy difícil obtener los métodos útiles que están ocultos profundamente dentro de los cierres.
Ahora funciona bien.
fuente
fuente
La respuesta aceptada por Josh David Miller funciona muy bien si está tratando de agregar dinámicamente una directiva que utiliza una línea
template
. Sin embargo, si su directiva aprovechatemplateUrl
su respuesta, no funcionará. Esto es lo que funcionó para mí:fuente
Josh David Miller está en lo correcto.
PCoelho, en caso de que se pregunte qué
$compile
hace detrás de escena y cómo se genera la salida HTML de la directiva, eche un vistazo a continuaciónEl
$compile
servicio compila el fragmento de HTML ("< test text='n' >< / test >"
) que incluye la directiva ("prueba" como elemento) y produce una función. Esta función se puede ejecutar con un alcance para obtener el "resultado HTML de una directiva".Más detalles con ejemplos de código completo aquí: http://www.learn-angularjs-apps-projects.com/AngularJs/dynamically-add-directives-in-angularjs
fuente
Inspirado en muchas de las respuestas anteriores, se me ocurrió la siguiente directiva "stroman" que se reemplazará con cualquier otra directiva.
Importante: Registre las directivas con las que desea usar
restrict: 'C'
. Me gusta esto:Puedes usar así:
Para obtener esto:
Protip. Si no desea utilizar directivas basadas en clases, puede cambiar
'<div></div>'
a algo que le guste. Por ejemplo, tener un atributo fijo que contiene el nombre de la directiva deseada en lugar declass
.fuente