Унификация URL-адресов маршрутизации для независимых страниц, отображаемых внутри iframe
У меня есть несколько приложений (одностраничное приложение, независимое) на angularjs. Они имеют различный стиль пользовательского интерфейса.
Мне пришлось создать новое приложение ( независимый ) с навигационной панели в левой части страницы и iframe в правой части страницы.
панель навигации частично решает проблему унификации стиля пользовательского интерфейса.
Iframe будет содержать другие независимые приложения.
Iframe является требование
Я создал приложение с навигацией и iframe, на основе angularJs.
в результате основное приложение загружает независимые модули (SPA / AngularJs) iframe, и эти модули работают нормально.
но есть "маленькая" проблема. Каждый независимый модуль имеет собственный маршрут angularjs. Он работает, но не отображается в главном окне ( в главном приложении, где находится iframe )
возможно ли унифицировать маршрут главного окна приложения и маршрут маршрута iframe.
любой идеи?
1 ответов
хорошо, я потратил немного времени, чтобы вы предложили рабочее решение. Однако он предполагает определенный уровень согласованности и контроля над вашими угловыми приложениями.
Шаг первый состоял в том, чтобы просто добавить навигацию со ссылками на раздел моего sub angular applciation:
<nav>
<ul>
<li><a href="#/app1/main">App1</a></li>
<li><a href="#/app2/home">App2</a></li>
</ul>
</nav>
на той же родительской странице Я также добавил iframe как вы требуются :)
<section>
<iframe src=""></iframe>
</section>
со следующими сценариями для обработки изменений адреса в Родительском окно:
// Simple method to look for the second index of something
String.prototype.secondIndexOf = function (val) {
var fst = this.indexOf(val);
var snd = this.indexOf(val, fst + 1)
return snd
}
// My goto method to basically go to somewhere in my angular apps
function goto(app, route) {
$('iframe').attr('src', app + '/test.html#' + route)
}
// upon hash change of the parent page I will call my goto method if there is a hash
$(window).on('hashchange', function () {
var hash = location.hash;
if (hash) {
var appName = hash.substring(hash.indexOf('app'), hash.indexOf('app') + 4);
var route = hash.substring(hash.secondIndexOf('/'));
goto(appName, route);
}
});
// On initial page load I also like to trigger this hash change to
// go to the right location initially
$(window).trigger('hashchange');
очевидно, что это кажется односторонним решением, если мы также не создадим обратную модификацию url из дочерних угловых приложений до родительского окна.
чтобы достичь этого, я решил вернуть изменения хэша в родительское окно внутри события $routeChangeStart каждого приложения:
так, например, для app1 это будет:
.run(["$rootScope", function ($rootScope) {
$rootScope.$on('$routeChangeStart', function(next, current) {
if (current.$$route){
window.parent.location.hash = "#/app1" + current.$$route.originalPath;
}
});