@makerkz

Как отслеживать изменения в Angular для jQuery?

Возникли проблемы с формулировкой вопроса. Если что, прошу поправить.

Есть AngularJS приложение, в которое было решено подключить различные скрипты (для анимаций, уведомлений и т.д., Bootstrap JS, например). Примерная структура приложения:
- index.html - подключение всех JS, CSS файлов и т.д.
- /scripts - скрипты и прочее
- /partials/page.html - шаблон страницы.
- /partials/page2.html - шаблон другой страницы.

Содержимое файла index.html:
...head
<ui-view></ui-view>
...foot

В index.html через ui-view (используется ui-router) подключается файл page.html. В общем-то ничего сложного. Теперь о проблеме - для конкретизации возьмем, к примеру, bootstrap tooltip:
<button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="top" title="Tooltip on top">Tooltip on top</button>

Если подключать данный код в файл index.html, то все работает. Если же подключить его в файл page.html, то работать ничего не будет (оно и понятно, для этого рекомендуется использовать директивы - ui.bootstrap, например).

Не работает все потому, что при загрузке jQuery он просматривает DOM-дерево (вместо содержимого page.html у нас в этот момент обычный ui-view, tooltip'а у нас в этот момент само-собой нет, он появляется после загрузки AngularJS шаблона).

Проблему данную можно было бы решить сборкой html шаблонов в js файл (grunt-html2js), что я и сделал. Теперь динамически шаблоны не подключаются, а подключается лишь один js файл, шаблоны грузятся через $templateCache. Вроде бы все дожно работать, но нет, при загрузке другой страницы - например, page2.html, все снова слетает, и приходится перезагружать страницу. Не работает все потому (как вы наверно уже догадались), что page2.html подгружается в DOM-дерево динамически.

Как я понял, сделать refresh DOM-дерева с помощью jQuery нельзя (можно лишь сделать watching функций с помощью on()). Мне нужно, чтобы при загрузке нового шаблона в DOM через ui-view работали все функции, которые связаны с jQuery. Функций, как таковых нет, работа идет через data-аттрибуты.
data-toggle="tooltip" data-placement="top"
Что бы вы могли посоветовать в данном случае? Хотя бы, куда можно обратиться с данной проблемой?
  • Вопрос задан
  • 2855 просмотров
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Директивы. Напишите директиву которая подключает тултипы и все будет хорошо. Вообще любые манипуляции в DOM стоит делать через директивы и только.
Ответ написан
Serhioromano
@Serhioromano
Web Developer
Можно попробовать испоьзовать событие $viewContentLoaded.

var app = angular.module('myApp', []).run(function($rootScope){
    $rootScope.$on('$viewContentLoaded', function(){
        $('[data-toggle="tooltip"]').tooltip();
        $.tooltip.init();
        $.fn.tooltip.init();
    });
})


И так реинициировать все типа бустрап чтучки. Тут 3 варианта так как я не пробовал и не знаю что быдет работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы