AngularJS: использование $compile для добавления html к веб-странице

У меня есть динамическая веб-страница, созданная предыдущими записями, сделанными пользователем. Это означает просмотр списка возможных входных данных, которые они могли выбрать, а затем добавление их в html в директиве.

Чтобы все мои ng-теги работали, мне нужно запустить этот большой кусок html через $compile, чтобы они все еще работали. Это работает нормально, теперь моя проблема заключается в том, что я пытаюсь создать более сложные поля, в которых используются настраиваемые директивы или классы jquery, которые просто отказываются работать должным образом после того, как были пропущены через $compile.

Например -

<div data-j-signature="obj.Test" data-pen-color="#0000ff" data-line-color="#00000" style="border:1px #000 solid;"></div><div class="col-sm-11">

Здесь используется хорошо используемая угловая библиотека под названием JSignature, и она будет нормально работать, если ее разместить где-нибудь на моей веб-странице, но не при выполнении процесса компиляции.

Я не обязательно ищу ответ для этой конкретной проблемы, поскольку я чувствую, что это будет постоянная проблема с большим количеством полей, которые я пытаюсь добавить. Есть ли у кого-нибудь общие советы о том, как обойти это? Есть ли альтернатива, которую я не вижу?

Вот мой html -

<div ng-repeat="Question in Questions">
    <question-type></question-type>
</div>

Вот важная часть того, что моя директива делает в конце после объединения множества строк html вместе:

var compiledHtml = $compile(stringOfHtml)(scope);
element.append(compiledHtml);

person user3407039    schedule 24.07.2015    source источник
comment
Кто создает экземпляр datepicker? Директива или сценарий инициализации?   -  person a better oliver    schedule 24.07.2015
comment
Привет, я убрал средство выбора даты из своего поста, потому что подумал, что более уместно показать пример angular, который не работает.   -  person user3407039    schedule 24.07.2015
comment
JSignature тоже jQuery. Если вы оборачиваете вокруг него директиву, это, вероятно, предполагает, что элемент уже присутствует в DOM, но вы вставляете его после компиляции.   -  person a better oliver    schedule 24.07.2015
comment
Ах да... Я просто думал о директиве, а не о библиотеке. Проверив это еще немного, он сначала попадает в директиву jsignature, затем компилируется в моей директиве, а затем переходит в библиотеку jquery jsignature. Как вы думаете, может ли отсрочка компиляции в самом конце решить эту проблему?   -  person user3407039    schedule 24.07.2015


Ответы (1)


Это использует средство выбора даты jquery и будет нормально работать, но не при добавлении, а затем при компиляции в моей директиве.

И это действительно суть вашей проблемы. Вы не можете ожидать, что плагины jQuery будут работать должным образом внутри приложения Angular, просто потому, что их жизненные циклы не очень хорошо совпадают. Я объясню лучше.

Когда вы запускаете приложение, некоторый HTML с директивами и привязкой Angular анализируется и компилируется Angular. это я в порядке. На этом этапе ваши плагины jQuery, вероятно, даже будут правильно инициализированы, потому что обычно им просто нужно отобразить DOM. Однако что произойдет, когда вы добавите только что скомпилированный динамический HTML? Angular хорошо поймет это, потому что вы вызываете $compile. Но jQuery может быть десинхронизирован и никогда не будет повторно инициализировать плагины.

Это основная причина, по которой вы не должны использовать jQuery так, как мы все привыкли. В идеале использование jQuery (и манипулирование DOM в целом) должно быть ограничено только пользовательскими директивами. Это единственный способ быть на 100% уверенным, что и Angular, и jQuery обновляют/инициализируют свои вещи в нужный момент.

Итак.. Вам нужен датапикер? Большой! Доступно множество директив Angular (например, интерфейс Angular datepicker), которые просто обертывают jQuery подключается к функции связывания, что делает его совместимым с рабочим процессом Angular и циклами дайджеста.

person dfsq    schedule 24.07.2015
comment
Спасибо за информацию. Я планирую избавиться от jquery, так что, возможно, мне нужно было просто использовать угловой пример, который не работает, я обновлю свой пост. - person user3407039; 24.07.2015
comment
Отредактировал мой пост, если у вас есть еще предложения :) - person user3407039; 24.07.2015