2013-12-15 1 views
8

ho questa struttura statale:Avere genitore di default stato a stato figlio utilizzando ui-router

.state('places', 
{ 
    url:'/places', 
    controller:'PlacesController', 
    templateUrl:'views/places.html' 
}) 
.state('places.city', 
{ 
    url:'/:city', 
    templateUrl:function(stateParams) 
    { 
     return 'views/places/'+stateParams.city+'.html'; 
    } 
}); 

E funziona bene, tranne quando l'URL è semplicemente /places senza una città dopo di esso.
Come posso avere un valore predefinito per templateUrl nello stato bambino?

Sto pensando che il modo migliore sarebbe quello di impostare l'interfaccia utente da PlacesController, tuttavia ciò non sembra possibile.

+0

può impostare un jsfiddle? –

+0

Siamo spiacenti, non è stato selezionato Evidenziatore di sintassi. Dovrebbe essere pulito da leggere ora. – Francisc

+0

possibile duplicato di [stato figlio predefinito angularjs ui-router] (http://stackoverflow.com/questions/17001589/angularjs-ui-router-default-child-state) –

risposta

0

Come indicato nella pagina Angular-UI Wiki:

Ci sono tre modi per attivare uno stato:

  1. chiamata $ state.go(). Metodo di convenienza di alto livello.
  2. Fare clic su un collegamento contenente la direttiva ui-sref.
  3. Passare all'URL associato allo stato.

https://github.com/angular-ui/ui-router/wiki#activating-a-state

+6

Questa risposta non dovrebbe essere accettata. Non risponde alla domanda, che riguarda il default a uno stato secondario quando viene invocato uno stato genitore. – XML

+1

+1 per la risposta, ho avuto la stessa domanda dell'OP e sembrerebbe che invocare un bambino da un genitore non sia il giusto modo di pensare, semplicemente accedendo alla rotta del bambino ha lo stesso effetto senza pensare. – HappyCoder

+0

questa non è una soluzione per delegare uno stato da suo figlio! –

15

Prova definire un altro stato bambino con l'URL impostato su una stringa vuota:

.state('places.default', { 
    url: '', 
    templateUrl: '...' 
} 

Quindi aggiungere abstract: true allo stato genitore.

+1

Hm, è intelligente. Sarei felice se ci fosse un metodo per cambiare l'URL del modello 'ui-view' direttamente però. – Francisc

+0

Non conosco alcuna funzione del genere in ui.router. –

+0

Grazie, Aaron. [caratteri extra] – Francisc

7

Senza bisogno di alcun cambiamento nella configurazione stati, si può mettere il modello predefinito direttamente tra le ui-view tag nel codice HTML:

<!-- places.html --> 
<div ui-view> 
    <h1>Please choose a place</h1> 
</div> 

<!-- london.html --> 
<h1>London is amazing!</h1> 

Ora, quando si passa a /places , vedrai il messaggio "Scegli un luogo" e quando navighi su /places/london vedrai "Londra è incredibile!".

+0

Boom! Proprio quello di cui avevo bisogno, grazie! –

1

come dichiarato da Aaron è possibile utilizzare $ Stato per passare a uno stato infantile di default ma qui c'è un problema dici si supponga di avere più di 1 bambino:

.state('places', 
    { 
     url:'/places', 
     controller:'PlacesController', 
     templateUrl:'views/places.html' 
    }) 
    .state('places.city', 
    { 
     url:'/:city', 
     templateUrl:function(stateParams) 
     { 
      return 'views/places/'+stateParams.city+'.html'; 
     } 
    }) 
    .state('places.child2', 
    { 
     url:'/:city2', 
     templateUrl:function(stateParams) 
     { 
      return 'views/places/'+stateParams.child2+'.html'; 
     } 
    }); 

e in voi regolatore genitore PlacesController hai $ state.go (places.city) allora ogni volta che il controller genitore cioè PlacesController viene richiamato sarete reindirizzati alla città-stato. Quindi, se qualcuno si trova nello stato child2 e preme un pulsante di aggiornamento, il controller genitore verrà richiamato e verrà reindirizzato in una città che non è quello che desideri!

ANS: modo da poter controllare per lo stato attuale prima di fare una redirezione cioè se la persona è in stato di genitore poi reindirizzare a qualsiasi stato figlio di default, ma se la persona è in uno qualsiasi degli stati figlio allora non lo fanno il reindirizzamento nel controllore genitore: -

if($state.current.name == "places"){ 
    $state.go('places.city'); 
} 

spero che questo aiuti!

+0

come commento, il secondo busto del blocco di codice si trova in 'PlacesController' –

1

Usa determinazione dello stato genitore

.state('places', 
{ 
    url:'/places', 
    resolve: { default: function($state) { 
     if ($state.is('places')) $state.go('places.city', { url: 'london'}) 
    }} 
    controller:'PlacesController', 
    templateUrl:'views/places.html' 
}) 
.state('places.city', 
{ 
    url:'/:city', 
    templateUrl:function(stateParams) 
    { 
     return 'views/places/'+stateParams.city+'.html'; 
    } 
}); 

Verificare la presenza di errore di sintassi, io sono abituato a CoffeeScript :)