Как динамически подгрузить всплывающее окно в AngularJS?
Имеется веб-проект: backend - asp.net, frontend - angularjs.
Есть страница, за которую отвечает модуль mainApp.
Есть страница с регистрацией, за которую отвечает LoginLayerApp.
Чего хочется: при нажатии на кнопку всплывало окно с регистрацией.
Что пробовал:
1.) Подгружать с помощью JQuery и внедрять в DOM.
2.) Подгружать через $http в AngularJS и с помощью библиотеки ngDialog открывать всплывающее окно.
3.) Воткнуть в iframe
Проблема в том, что подгружается голый HTML, но я не знаю как "за-inject-ить" LoginLayerApp, чтобы затем перекомпилировать этот голый подгруженный HTML.
Как это сделать наиболее правильно? Может быть следует вообще по-другому организовать?
RequireJS или WebPack использовать не выйдет, слишком большой legacy-проект для внедрения ради такой мелочи.
А воспользоваться штатными возможностями AngularJs(указать templateUrl:'path' в компоненте/директиве) вы почему не хотите?
Если таки не хотите - нужно вызвать $compile для загруженного куска DOM.
Хочу наиболее просто решить проблему. Через $compile запутался какая должна быть последовательность действий, напр.
1.подгрузить банд с модулем
2.выполнить его
3.внедрить в angular
4.загрузить страницу
5.открыть всплывающее окошко
6.перекомпилировать DOM.
Николай: попробовал подгрузить, все скомпилировалось, но не полностью. Я так понял проблема в том, что в страница с регистрацией написана под другой контролер loginLayerController, и вот он почему-то не вызывается.
// Подгружаю данные через сервис svc(к $http обращение внутри)
svc.getRegistrationLayer().success(function (data) {
// Подгружаю отдельно вручную таблицу стилей
var link = document.createElement('link');
link.rel = "stylesheet";
link.type = "text/css";
link.href = "/Content/css/layers/Login/loginRegistrationLayer.min.css";
// Добавляю таблицу стилей в head
document.head.appendChild(link);
// В место для всплывающего окна вставляю полученную data
$('#placeForLayer').append(data);
// Отображаю
$('#placeForLayer').parent().show();
// Компилирую
angular.bootstrap(document, ['loginLayerApp']);
});
Использовал смесь с чистым JS и ещё JQuery чтобы просто заставить это работать хотя бы.
вам нужно бутстрарпить не на document, а на той ноде, в которой у вас написано ng-app='loginLayerApp'. Ну а дальше ,если ангуляр через DI что-то не может задеплоить, нужно это ему помочь. У вас модуль прям так и называется "loginLayerApp"?
Николай: я решил напрямую указать зависимость от loginLayerApp и сразу его включать без доп. загрузки, загружать динамически только html с css.
Оно вроде рендерится, но только один раз. Т.е. бизнес-логика не следит за изменениями и не перерисовывает view, только один раз, когда я явно указываю bootstrap
Николай: надоела эта фигня, решил сразу сделать inject нужной библиотеки и контроллеров, объявив зависимость, а html внедрил как template. Устал бороться с этой чёртовой динамической загрузкой
у контроллера нет директив и тд. имеется ввиду модуль. только вот зачем там модуль? лучше написать компонент/директиву внутри модалки. вот примерчик с рабочего прилоения. это бутстраповская модалка регистрации
у меня на кнопке вызова модалки висит слушатель клика с помощью компонента. при нажатии компонент вызывает модалку со своим контроллером(это особенность бутстрапа для ангулара). получается эдакая независимая страница
ozknemoy: можно писать код в редакторе ниже для ответа на вопрос, а потом его вставлять в комментарии.
Не очень понял, т.е. вы предлагаете перенести всю логику из контроллера в директиву?
У меня сейчас есть отдельная страница регистрации, на которой подгружается модуль LoginLayerApp вместо с контроллером, несколькими директивами и сервисами.
Как это все перенести в одну директиву? Возможно я путаюсь в терминах Angular и не совсем понимаю суть.
пускай модуль грузится как есть. к нему написать компонент-кнопку(или директиву если ангулар старый) . на нее кликаешь и вызывается окно модалки то что в templateUrl написано. и к этой вьюшке идет controller: modalController. модалкак считай как тдельное вью+контроллер. но эта схема возможна ток смодалкой bootstrap/ так как она создает отдельный скоуп
ozknemoy: таким образом не работает, выше описывал ситуацию. Да и грузить библиотеку bootstrap с кучей лишнего ради просто модального окна - все равно что забивать гвоздь лопатой.