У меня есть очень упрощенная версия того, что я делаю, и эта проблема решается.
У меня все просто directive
. Каждый раз, когда вы нажимаете на элемент, он добавляет еще один. Тем не менее, он должен быть скомпилирован в первую очередь, чтобы правильно отобразить.
Мои исследования привели меня к $compile
. Но во всех примерах используется сложная структура, которую я не знаю, как применить здесь.
Скрипки здесь: http://jsfiddle.net/paulocoelho/fBjbP/1/
И JS здесь:
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>");
});
}
};
});
Решение Джоша Дэвида Миллера: http://jsfiddle.net/paulocoelho/fBjbP/2/
$compile
? Спасибо за ваш ответ, кстати!$compile
служба - это то, что связывает директивы и подключает их к циклу событий. В$compile
такой ситуации нет никакого способа обойтись, но в большинстве случаев другая директива, такая как ngRepeat, может выполнить ту же работу (поэтому ngRepeat выполняет компиляцию за нас). У вас есть конкретный вариант использования?В дополнение к прекрасному примеру Riceball LEE по добавлению новой директивы элемента
Добавление новой директивы атрибута к существующему элементу может быть сделано следующим образом:
Допустим, вы хотите добавить на лету
my-directive
кspan
элементу.Надеюсь, это поможет.
источник
Maximum call stack size exceeded
Ошибка всегда происходит из - за бесконечной рекурсии. Я никогда не видел случая, чтобы увеличение размера стека решило бы это.Динамическое добавление директив на angularjs имеет два стиля:
Добавьте директиву angularjs в другую директиву
вставка нового элемента (директива)
это просто. И вы можете использовать в «ссылку» или «компилировать».
вставка нового атрибута в элемент
Это тяжело, и у меня болит голова в течение двух дней.
Использование «$ compile» вызовет критическую рекурсивную ошибку !! Возможно, он должен игнорировать текущую директиву при повторной компиляции элемента.
Итак, я должен найти способ вызвать директиву «link». Очень трудно найти полезные методы, которые скрыты глубоко внутри замыканий.
Теперь это хорошо работает.
источник
источник
Принятый ответ Джоша Дэвида Миллера прекрасно работает, если вы пытаетесь динамически добавить директиву, использующую встроенный метод
template
. Однако, если ваша директива используетtemplateUrl
его ответ, ничего не получится. Вот что сработало для меня:источник
Джош Дэвид Миллер прав.
PCoelho, в случае, если вам интересно, что
$compile
происходит за кулисами и как вывод HTML генерируется из директивы, пожалуйста, посмотрите ниже$compile
Службы компилирует фрагмент HTML ("< test text='n' >< / test >"
) , который включает в директиве ( «тест» в качестве элемента) и производит функцию. Затем эту функцию можно выполнить с областью действия, чтобы получить «вывод HTML из директивы».Более подробная информация с примерами полного кода здесь: http://www.learn-angularjs-apps-projects.com/AngularJs/dynamically-add-directives-in-angularjs
источник
Вдохновленный многими предыдущими ответами, я придумал следующую директиву «stroman», которая заменит себя другими директивами.
Важно: Зарегистрируйте директивы, которые вы хотите использовать
restrict: 'C'
. Как это:Вы можете использовать как это:
Чтобы получить это:
Protip. Если вы не хотите использовать директивы, основанные на классах, вы можете изменить
'<div></div>'
то, что вам нравится. Например, есть фиксированный атрибут, который содержит имя желаемой директивы вместоclass
.источник