2014-04-10 14 views
5

dilagare sul angolare e ui-router

E alle prese con il reindirizzamento ad uno stato diverso se una precondizione non è soddisfatta:

Ho provato ad utilizzare un intercettore: (How do I preform a redirect in an angular interceptor).

Ma qualcuno ha detto che gestire $ stateChangeState sarebbe più appropriato. Ma io sono ancora in esecuzione in un ciclo infinito:

/** 
    * Check here for preconditions of state transitions 
    */ 
    $rootScope.$on('$stateChangeStart', function(event, toState) { 

     // which states in accounts to be selected 
     var accountRequiredStates = ['user.list', 'user.new']; 
     if(_.contains(accountRequiredStates, toState.name)){ 
      event.preventDefault(); 
      ApiAccount.customGET('get_current').then(function(resp){ 
       // if I have a selected account, go about your business 
       if(resp.hasOwnProperty('id')){ 
        $state.go(toState.name); 
       } else { // prompt user to select account 
        $state.go('user.select_account'); 
       } 
      }) 
     } 
    }); 

Qualcuno può suggerire un modello migliore (quello che funziona)

Grazie!


Nota: problema simile approccio diverso qui: How do I preform a redirect in an angular interceptor

+0

si dovrebbe solo prevenire l'evento se si desidera reindirizzare. Immagino che '$ state.go' debba essere inserito in una funzione' $ timeout'. – zeroflagL

+0

grazie - potresti condividere un codice snipit? – Jonathan

+0

Penso che la tua domanda sia duplciata con http://stackoverflow.com/questions/21631896/why-does-this-angular-ui-router-code-cause-an-infinite-loop-in-digest – linkary

risposta

1

Non credo che ci sia qualcosa di sbagliato nel modo in generale, si sta cercando di fare questo, anche se non sono un esperto. Vedo un difetto nell'implementazione che sembra possa causare un loop infinito. Diciamo che l'utente prova ad andare nello stato 'user.new'. Il listener $ stateChangeStart intercetta che, annulla, fa il tuo customGET; quindi se la condizione inner if è vera (resp.hasOwnProperty('id')), si tenta di inviare l'utente allo stesso stato 'user.new'. A quel punto, il listener $ stateChangeStart lo intercetta, annulla, ecc., Più e più volte.

Il mio modo di evitare questo problema nel mio codice è quello di avere una variabile (nel servizio in cui dichiaro l'ascoltatore) di aiutarmi a bypass che controlla: var middleOfRedirecting = false; All'interno del vostro interiore se blocco all'interno del check resp.hasOwnProperty('id'), impostare middleOfRedirecting a vero; aggiungi una condizione all'inizio del listener $ stateChangeStart per chiamare solo event.preventDefault() e reindirizzare se middleOfRedirecting è false. Avresti anche bisogno di un listener $ stateChangeSuccess per impostare middleOfRedirecting su false, resettandolo per il prossimo cambio di stato. (Mi sembra che ci dovrebbe essere un modo migliore di questo, ma almeno funziona.)