2016-05-03 15 views
8

Questo mi è stato facendo impazzire per l'ultimo paio di ore e non riesco a trovare una soluzione ancora ...angolari risolve ui-router chiamato due volte

Fondamentalmente sto cambiando lo stato a 404 quando una volontà restituisce un codice di stato http 404. Sto cambiando lo stato nell'evento $stateChangeError. Funziona tutto bene, tranne dopo che lo stato è stato modificato in 404, si ricomincia da un altro cambiamento di stato a quello originale, risolvendosi in questo modo due volte. Lo stato stesso rimane su 404, quindi, dopo tutto, funziona, ma rende ancora richieste aggiuntive $http che non sono necessarie. Tuttavia, funziona solo in questo modo se utilizzo $state.go('404', null, { location: false }) OPPURE se lo stato 404 non ha un URL definito.

Se si dispone di un url definito per lo stato 404 (/404), quindi tutto funziona correttamente.

Qui ci sono 2 penne, dimostrando la questione:

L'unica mancanza: http://codepen.io/cprfnaporf/pen/RaqmQN (modalità di debug, controllare la console: http://s.codepen.io/cprfnaporf/debug/RaqmQN/)

quello lavorativo: http://codepen.io/cprfnaporf/pen/MyzdVQ (modalità di debug, controllare console: http://s.codepen.io/cprfnaporf/debug/MyzdVQ/)

Qualche idea su come risolvere questo problema? Sono davvero fuori di idee.

Grazie!

+0

Specifica la tua esatta funzionalità desiderata. Vuoi passare allo stato 404 senza mostrare una nuova vista? Non sono sicuro di quale sia il tuo obiettivo finale. – BatteryAcid

+0

Voglio cambiare lo stato in 404 senza modificare l'url. Funziona, ma come puoi vedere nella console le risoluzioni vengono eseguite due volte in quel caso (per qualche motivo prova a caricare di nuovo lo stato con le risoluzioni). – Andrew

+0

Quale 'risoluzione' viene attivata due volte? – Zakaria

risposta

4

Per me, hai già trovato la soluzione. In effetti, come indicato nel codice:

$urlRouterProvider.when('/', '/profile/x/details'); 

l'URL predefinito è /profile/x/details. Quando l' vede l'URL , proverà a caricare la gerarchia degli stati: base, base.profile e base.profile.details. Come hai detto, l'ultimo non verrà caricato poiché si rileva un errore 404 e si reindirizza la richiesta altrove.

Il problema è che ci si trova ancora a /profile/x/details. Quindi nel stateChangeError, quando hai fatto il $state.go('404', null, { location: false });, ui-router controllerà l'url.

Poiché non è impostato nello 404, prenderà quello che ha: /profile/x/details. Ed è per questo che ha risolto la stessa gerarchia di stati: base, base.profile e base.profile.details.

+0

Sì, capisco tutto questo, ma il problema rimane ancora. Come posso evitare le risoluzioni aggiuntive? Lasciarli li sembra davvero brutto per me, ma non voglio aggiornare l'url perché sarebbe una UX male anche secondo me. – Andrew

+0

@Andrew Capisco davvero il tuo problema. Ma, penso che il problema principale sia il design dell'app e più specificamente la gerarchia degli stati. – Zakaria

+0

No, sono abbastanza sicuro che vada tutto bene. Guarda il mio ultimo commento sulla risposta di ** BatteryAcid **! Grazie per il tuo sforzo! – Andrew

4

@Andrew Immagino di non essere sicuro di quali siano esattamente i tuoi obiettivi ma sembra che tu stia combattendo nel modo in cui funziona il router.

@Zakaria fa un buon lavoro riassumendo i problemi.

Forse fare un passo indietro e vedere se ha davvero senso mantenere un utente su una pagina morta o parzialmente morta. Se stai tentando di gestire una risoluzione fallita, allora forse prendi quella 404 (o richiesta non riuscita) e restituisci una risoluzione predefinita invece di passare a un nuovo stato di errore. Mantenendo la tua dichiarazione when allo $urlRouterProvider.when('/', '/profile/x/details'); hai problemi solo nel modo in cui è attualmente progettata

+0

Bene, questa è la cosa. Non è a causa dell'istruzione '.when'. È lì solo per illustrare il problema velocemente. Il fatto è che accade sul caricamento iniziale della pagina anche se non è reindirizzato, ma non sono riuscito a trovare un modo per illustrarlo in codepen. Quindi se apri '/ profile/x/details' direttamente il problema si verifica ancora. Nella vera applicazione non sto usando questa istruzione 'when'. – Andrew

+0

Ok. Che ne dici di gestire la risoluzione con più grazia? – BatteryAcid

+0

Cosa proponi? Non riesco davvero a pensare a un modo che sarebbe facile da usare in termini di app. Fondamentalmente voglio solo mostrare una vera e propria pagina 404 quando * qualsiasi * chiamata API restituisce 404, senza cambiare l'url. Dovrei effettivamente restituire alcuni tipi di dati personalizzati e avvolgere ogni singola chiamata API? Sarò onesto, mi sembra un enorme esagerazione per un compito così piccolo. Non sto cercando di fare il pelo qui, spero che tu capisca. :) – Andrew

Problemi correlati