[AngularJS] Routing bez HashBangu rubrika: Programování: JavaScript
var app = angular.module("app", ["ngRoute"]); app.config(function($routeProvider, $locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false // alebo použiť <base href=""> ale base URL nieje známa }); $routeProvider .when("/", { templateUrl : "main.html" }) .when("/prva", { templateUrl : "prva.html", controller : "ctrl1" }) .when("/druha", { templateUrl : "druha.html", controller : "ctrl2" }) .otherwise({ redirectTo : '/' }); });
problém je ten že Ak by som chcel použiť tak tá sa mení (teda je neznáma).
Ako zabezpečiť aby routing vedel že má routovať od úrovne kde sa nachádza index.html ? Problém je že index.html sa nenachádza v web.com/index.html ale je to web.com/neco/neco/index.html (a ja nevím to neco).
ďalšia otázka je ohladom .otherwise ktorý ale v html5Mode nieje podporovaný. Ako ale zabezpečiť aby to fungovalo aj v prípade html5Mode ?
Pokial dopredu to neco/neco
nepoznas, pripadne sa moze aj menit, tak to nikdy nieje lahka situacia. Ja som nieco velmi podobne teraz riesil a dospel som ku nasledovnemu rieseniu.
V prvom rade je tu jedna pre-condition. Ocakavam, ze po deploynuti budem mat v hlavicke kratucky JS kod, v ktorom su nejake zakladne parametre o prostredi. Nutno dodat, ze toto nieje vzdy uplne idealne riesenie a treba davat obzvlast velky pozor na security, nakolko sa to pomerne lahko da obist. Ak pouzies nieco podobne, bud velmi velmi opatryn. Cize ja ocakavam v hlavicke napr. toto:
window.env = { baseHref: '/whatever/', apiUrl: 'http://example.com/api/v1' ... }
V tvojom pripade - ak takato "injektaz" nieje mozna, cisto ziskanie baseHref vies spravit ako si to sam ukazal vyssie. Mozno je to dokonca este lepsie pre tento pripad (ak nemas ziadnu inu environment variable).
Dalej predpokladam, ze index.html
uz nenacitava ziadny iny subor priamo z tejto domeny (externe fonty/js a pod. su v pohode). Inymi slovami, zatial sa nic nestahuje neinicializuje, proste nic, biela stranka (ani v konzole nieje ziadny vystup, ziadny asset sa nestahuje...). Vtip je v tom, ze rovnako ako ty vyssie nastavim baseHref
a az potom zacnem includovat akekolvek subory z mojej domeny (js, css, ...).
(function() { document.getElementById('baseHref').href = window.env.baseHref; var myJsBundle = document.createElement('script'); myJsBundle.type = 'text/javascript'; myJsBundle.src = '/js/bundle.js'; var body = document.getElementByTagName('body'); body.appendChild(myJsBundle); })();
Takto je dosiahnute, ze scripty sa nacitavaju az po nastaveni baseHref
a teda cesty budu uz platit s baseHref
nastavenym vopred, cize cesta /js/bundle.js
sa realne nacita z /whatever/js/bundle.js
. Samozrejme, tymto sposobom je mozne includovat scripty aj v cykle alebo hociako inak, ide len o pointu. Nevyhoda je, ze musis vopred poznat subory ktore sa maju nacitat co moze byt problem ak tie su zabalovane napr. webpackom a obsahuju timestampy a pod.. Aj to sa da riesit, konkretne ja som pouzil plugin https://github.com/jantimon/html-webpack-plugin
Na zaver chcem dodat, ze vobec to nieje idealne. V skutocnosti to sposobi maly lag, nakolko zdrojaky sa nezacnu nacitavat hned. Ide ale o takmer nemeratelne zdrzanie a aspon sa vyriesi problem s variabilnym baseHref
.
PS: ospravedlnujem sa ak som v snippete urobil nejaku chybku, pisem dost narychlo. Pointa je ale myslim vystihntua.
Pro zobrazení všech 4 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře