2013-05-28 2 views

risposta

117

Non è possibile utilizzare solo $stateProvider.

che devono essere iniettate $urlRouterProvider e creare un codice simile a:

$urlRouterProvider.otherwise('/otherwise'); 

Il /otherwise URL deve essere definito in uno stato come al solito:

$stateProvider 
    .state("otherwise", { url : '/otherwise'...}) 

Vedere questo link dove ksperling explains

+0

Ho provato e ha funzionato! quindi questa è la migliore risposta;) – Adelin

+0

Puoi effettivamente usare '$ stateProvider'. È meno lavoro se si desidera solo visualizzare un modello, ma non reindirizzare. Preferisco la risposta di @ juan-hernandez. – weltschmerz

+0

il valore passato a 'altrimenti' (in questo caso' '/ altrimenti'') deve corrispondere al nome dello stato (il primo parametro a '.state') o al valore per l'opzione' url'? – d512

3

Ok, il momento sciocco in cui ti rendi conto che la domanda che hai posto ha già una risposta nelle prime righe del codice di esempio! Dai un'occhiata al codice di esempio.

 angular.module('sample', ['ui.compat']) 
     .config(
     [  '$stateProvider', '$routeProvider', '$urlRouterProvider', 
     function ($stateProvider, $routeProvider, $urlRouterProvider) { 
      $urlRouterProvider 
      .when('/c?id', '/contacts/:id') 
      .otherwise('/'); // <-- This is what I was looking for ! 


      .... 

Take a look here.

79

È possibile con $stateProvider utilizzando il fermo tutto sintassi ("*path"). Hai solo bisogno di aggiungere una configurazione di stato in fondo alla vostra lista come la seguente:

$stateProvider.state("otherwise", { 
    url: "*path", 
    templateUrl: "views/error-not-found.html" 
}); 

Tutte le opzioni sono spiegate in https://github.com/angular-ui/ui-router/wiki/URL-Routing#regex-parameters.

La cosa bella di questa opzione, al contrario di $urlRouterProvider.otherwise(...), è che non sei obbligato a cambiare posizione.

+0

potresti per favore elaborare: "non sei obbligato a cambiare posizione"? –

+1

Ciò che intende è che l'URL rimarrà quello che era. Quindi, se l'utente va a "/ this/does/not/exist", allora l'URL rimarrà in questo modo nella barra degli indirizzi. L'altra soluzione ti porta a '/ altrimenti' –

+0

Ho usato la tua soluzione e ha funzionato (posso mantenere l'url che non è stato trovato che è bello perché sto usando http://luisfarzati.github.io/angulartics/ e in questo modo posso anche vedere la navigazione in pagine che non sono state trovate) per i casi in cui l'URL a cui l'utente si sposta non esiste. Tuttavia se navigo a questo url usando $ state.go ('altrimenti') all'interno di un controller, perdo l'url. Navigando esplicitamente a questo stato quando l'utente accede alla pagina dei dettagli di un articolo e il server restituisce 404 (ad esempio se l'elemento è stato eliminato). Sai di un modo per risolvere questo problema? – pcatre

31

È inoltre possibile iniettare manualmente $ stato nella funzione altrimenti, che è possibile quindi navigare in uno stato non-url. Questo ha il vantaggio del browser che non cambia la barra degli indirizzi, che è utile per la gestione di tornare a una pagina precedente.

$urlRouterProvider.otherwise(function ($injector, $location) { 
     var $state = $injector.get('$state'); 

     $state.go('defaultLayout.error', { 
      title: "Page not found", 
      message: 'Could not find a state associated with url "'+$location.$$url+'"' 
     }); 
    }); 
+0

che ha risolto il mio problema su come verificare se siamo a metà dell'app o onload quando altrimenti viene utilizzato - grazie mille :) –

+0

mi hai salvato giorno! – Titmael

+0

Non dimenticare se vuoi minimizzare questo hai bisogno di iniettare $ –

0

I accepted answer riferimenti angular-route chiede di ui-router. La risposta accettata utilizza il "monolithic"$routeProvider, che richiede il modulo ngRoute (mentre ui-router ha bisogno del modulo ui.router)

Il highest-rated answer usa $stateProvider invece, e dice qualcosa come .state("otherwise", { url : '/otherwise'... }), ma non riesco a trovare alcuna menzione di "altrimenti" nello documentation it links. Tuttavia, vedo che $stateProvider è menzionato in this answer in cui si dice:

Non è possibile utilizzare solo $stateProvider. È necessario iniettare $urlRouterProvider

Ecco dove la mia risposta potrebbe aiutarti. Per me, è stato sufficiente usare $urlRouterProvider proprio come questo:

my_module 
    .config([ 
    , '$urlRouterProvider' 
    , function(
     , $urlRouterProvider){ 
      //When the url is empty; i.e. what I consider to be "the default" 
      //Then send the user to whatever state is served at the URL '/starting' 
      //(It could say '/default' or any other path you want) 
      $urlRouterProvider 
        .when('', '/starting'); 
        //... 
    }]); 

Il mio suggerimento è coerente con la ui-routerdocumentation, (this specific revision), dove si prevede un uso simile della.Metodo when(...) (la prima chiamata alla funzione):

app.config(function($urlRouterProvider){ 
    // when there is an empty route, redirect to /index 
    $urlRouterProvider.when('', '/index'); 

    // You can also use regex for the match parameter 
    $urlRouterProvider.when(/aspx/i, '/index'); 
})