2013-08-05 6 views
9

Sto costruendo un'app AngularJS che non si trova nella posizione root domain.tld/blog. Ho installato il routing per tutto sulla base /blog. Ho incluso il tag base nella testa della pagina <base href="/blog">. html5Mode è impostato su true. All'interno dell'app funziona tutto come previsto. Tuttavia, quando faccio clic su un URL non angolare al di fuori della posizione di base, la pagina non viene caricata. Sembra che questa posizione e 'colto dalla funzione otherwise nel router:AngularJS routing dirottamento URL non base quando è previsto il caricamento della pagina

ROUTER.otherwise({ 
    redirectTo : '/blog' 
}); 

Così, quando si fa clic su qualsiasi URL, cioè domain.tld/somewhere-else si reindirizza a domain.tld/blog. Ovviamente questo è quello che ti aspetteresti: per ogni URL che non si trova nel router, reindirizza la pagina alla "homepage". Nella mia app questo non è il comportamento desiderato. Tutti gli URL che non si trovano nel router devono essere trattati come un normale URL e generare una pagina di ricarica in tale URL.

Quindi quello che serve è qualcosa di simile:

ROUTER.otherwise(
    window.location = theRequestedUrl; 
); 

questo non funziona, ovviamente. Ma in qualche modo ho bisogno di entrare nella parte altrimenti del router e dirgli di reindirizzare alla pagina con una pagina di ricarica.

la seguente domanda è legata: angular routing something weird happening

Il seguente jsFiddle illustrato il problema http://fiddle.jshell.net/43tub/6/show/light/ (@rdjs grazie!). Clicca sul link /outside dovrebbe fare un aggiornamento completo pagina ...

+0

quale versione di AngularJS stai usando? – rdjs

+0

@rdjs 1.1.5, ma il comportamento è lo stesso in 1.0.7 – DivZero

+1

Ciò dimostra esattamente il problema? http://jsfiddle.net/43tub/6/ – rdjs

risposta

5

Guardando il code, sembra importante che la base è "/ blog /" invece di "/ blog". Una volta ho cambiato che ero in grado di fare riferimento ai collegamenti relativamente:

<a href="./Book/Moby">Moby</a> | 
    <a href="./Book/Gatsby">Gatsby</a> | 
    <a href=".">base root</a> | 
    <a href="/Outside">Outside</a> | // gets a nice 404 

mio jsfiddle, notare che location.pathname è sempre impostazione "[percorso] /", questo funziona anche hardcoded/_display/durante l'editing, ma jsfiddle passa da _display/a workingdir/show/quando è in esecuzione modificato e salva i fiddles.

+2

In effetti la barra finale mancante era il problema! Non ho preso questo perché la barra finale ha causato un sacco di errori con le librerie di conflitti che mi hanno fatto supporre che non dovrebbe avere una barra finale. Dopo aver risolto tutti gli errori con la libreria respond.js (ho abbandonato il proxy per l'host statico e ho usato un CSS condizionale extra per IE8 e sotto ...) Sto usando funziona come previsto! – DivZero

+0

Grazie @DivZero! Sospetto che prima del nostro lancio dovrò aggiungere la compatibilità IE8 alla mia app, quindi è bello sentirne parlare ora piuttosto che farlo da solo più tardi .. – lossleader

9

Secondo angolare documentation

In casi come il seguente, collegamenti non vengono riscritte; al contrario, il browser eseguirà il ricaricamento di una pagina intera sul collegamento originale.

  • Links che contengono dell'elemento a bersaglio
    Esempio: link <a href="/ext/link?a=b" target="_self">link</a>
  • assoluti che vanno a un dominio diverso
    Esempio: <a href="http://angularjs.org/">link</a>
  • Quick iniziano con '/' che portano ad un percorso di base diverso quando viene definita di base
    Esempio: <a href="/not-my-base/link">link</a>

vedere se questo ti aiuta

+2

Grazie per la risposta. Tuttavia ho già provato questo. L'utilizzo di un elemento target è una soluzione accettabile per me. E i collegamenti che iniziano con ''/'' fa ** non ** funzionano come previsto/documentato. Questo è esattamente ciò di cui ho bisogno, tuttavia semplicemente non funziona ... – DivZero

+1

Questa soluzione ha funzionato per me usando 'target =" _ self "' Grazie! –

+0

target = "_ self" era perfetto per me. molte grazie –

2

Si potrebbe anche fare qualcosa di simile:

var redirect = function(skip, url) { 
    console.log("Redirecting to ", url); 
    window.location.href = url 
}; 
$routeProvider 
    .when('/inside-router', { templateUrl: 'something.html' }) 
    .when('/get-me-away.html', { redirectTo: redirect }) 
    .when('/static/:file', { redirectTo: redirect }) 

Ecco un JSFiddle with a working example.

Fondamentalmente si sta abusando del fatto che AngularJS chiamerà una funzione fornita nella proprietà redirectTo e quindi non fare nient'altro se la funzione non restituisce una stringa.

0

Speranza che aiuta:

$routeProvider 
.when('...', {}) 
.otherwise({ 
    redirectTo: function() { 
    window.location = location.pathname; 
}}); 

utilizzando:
1.3.10/angular.js
1.3.10/angolari-route.js

Problemi correlati