[AngularJS] Routing bez HashBangu rubrika: Programování: JavaScript

6 Mlocik97
položil/-a 12.4.2018
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 ?

odkaz Vyřešeno
4 dominios
odpověděl/-a 16.4.2018

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.

Komentáře

  • Mlocik97 : díky,... áno to neco/neco se mení (a teda ho aj neznám). index.html je načitávaný len raz. Skúsim to tvoje riešenie... ešte raz díky :-) 16.4.2018

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.