Altrimenti su StateProvider


Risposte:


123

Non puoi usare solo $stateProvider .

Devi iniettare $urlRouterProvidere creare un codice simile a:

$urlRouterProvider.otherwise('/otherwise');

L' /otherwiseURL deve essere definito in uno stato come al solito:

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

Vedi questo link dove spiega ksperling


Puoi effettivamente usare $stateProvider. È meno faticoso se vuoi semplicemente visualizzare un modello, ma non reindirizzarlo. Preferisco la risposta di @ juan-hernandez.
weltschmerz

il valore passato a otherwise(in questo caso '/otherwise') deve corrispondere al nome dello stato (il primo parametro a .state) o al valore di urlopzione?
d512

Questo è ora deprecato - vedi risposta da @babyburger
Vedran

81

Puoi farlo $stateProviderusando la sintassi catch all ( "*path"). Devi solo aggiungere una configurazione di stato in fondo alla tua 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 $urlRouterProvider.otherwise(...), è che non sei obbligato a cambiare posizione.


potresti per favore elaborare you're not forced to a location change:?
Kevin Meredith

1
Quello che intende è che l'URL rimarrà quello che era. Quindi, se l'utente accede a /this/does/not/exist, l'URL rimarrà tale nella barra degli indirizzi. L'altra soluzione ti porterà a/otherwise
Matt Greer,

Ho usato la tua soluzione e ha funzionato (posso mantenere l'URL che non è stato trovato, il che è fantastico perché sto usando luisfarzati.github.io/angulartics e in questo modo posso anche vedere la navigazione alle pagine che non sono state trovate) per i casi in cui l'URL a cui l'utente naviga non esiste. Tuttavia, se navigo verso questo URL utilizzando $ state.go ('altrimenti') all'interno di un controller perdo l'URL. Passo in modo esplicito a questo stato quando l'utente va alla pagina dei dettagli di un elemento e il server restituisce 404 (ad esempio se l'elemento è stato eliminato). Conosci un modo per risolvere questo problema?
pcatre

@pcatre puoi usare l'opzione location = false e l'URL non cambierà. Per esempio. $ state.go ('altrimenti', {}, {location: false})
JakubKnejzlik

35

Puoi anche inserire manualmente $ state nella funzione else, che puoi quindi navigare in uno stato non URL. Ciò ha il vantaggio del browser che non modifica la barra degli indirizzi, il che è utile per gestire il ritorno 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+'"'
        });
    });

questo ha risolto il mio problema su come verificare se siamo mid-app o onload quando viene utilizzato altrimenti - grazie mille :)
Jörn Berkefeld

mi hai salvato la giornata!
Maelig

Non dimenticare se vuoi ridurre al minimo questo bisogno di $ inject
Sten Muchow

3

Ok, lo stupido momento 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 ! 


          ....

Dai un'occhiata qui.



0

I riferimenti di risposta accettatiangular-route chiedono su ui-router. La risposta accettata utilizza il "monolitico" $routeProvider , che richiede il ngRoutemodulo (mentre ui-routernecessita diui.router modulo)

La risposta con il punteggio più alto usa $stateProviderinvece e dice qualcosa di simile .state("otherwise", { url : '/otherwise'... }), ma non riesco a trovare alcuna menzione di "altrimenti" nella documentazione che collega . Tuttavia, vedo che $stateProviderè menzionato in questa risposta dove dice:

Non puoi usare solo $stateProvider. Hai bisogno di iniettare$urlRouterProvider

È qui che la mia risposta potrebbe aiutarti. Per me era sufficiente usare $urlRouterProviderproprio così:

 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-router documentazione , ( questa specifica revisione ), dove include un uso simile del file. when(...)metodo (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');
})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.