Usando angular-ui-router, ¿cómo puedo usar el método de lo contrario en $ stateProvider o cómo puedo usarlo?
Usando angular-ui-router, ¿cómo puedo usar el método de lo contrario en $ stateProvider o cómo puedo usarlo?
Respuestas:
No puedes usar solo $stateProvider
.
Necesita inyectar $urlRouterProvider
y crear un código similar a:
$urlRouterProvider.otherwise('/otherwise');
La /otherwise
URL debe definirse en un estado como de costumbre:
$stateProvider
.state("otherwise", { url : '/otherwise'...})
Vea este enlace donde explica ksperling
$stateProvider
. Es menos trabajo si solo desea mostrar una plantilla, pero no redirigir. Prefiero la respuesta de @ juan-hernandez.
otherwise
(en este caso '/otherwise'
) tiene que coincidir con el nombre del estado (el primer parámetro a .state
) o el valor de la url
opción?
Puede $stateProvider
usar la sintaxis catch all ( "*path"
). Solo necesita agregar una configuración de estado al final de su lista como la siguiente:
$stateProvider.state("otherwise", {
url: "*path",
templateUrl: "views/error-not-found.html"
});
Todas las opciones se explican en https://github.com/angular-ui/ui-router/wiki/URL-Routing#regex-parameters .
Lo bueno de esta opción, a diferencia de $urlRouterProvider.otherwise(...)
, es que no está obligado a cambiar de ubicación.
you're not forced to a location change
?
/this/does/not/exist
, la URL permanecerá de esa manera en la barra de direcciones. La otra solución le llevará a/otherwise
También puede inyectar $ state manualmente en la función de lo contrario, que luego puede navegar a un estado sin URL. Esto tiene la ventaja de que el navegador no cambia la barra de direcciones, lo cual es útil para manejar el regreso a una página anterior.
$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+'"'
});
});
Ok, el momento tonto en el que te das cuenta de que la pregunta que hiciste ya está respondida en las primeras líneas del código de muestra. Solo eche un vistazo al código de muestra.
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 !
....
Solo quiero intervenir en las excelentes respuestas que ya se proporcionan. La última versión de @uirouter/angularjs
marcó la clase UrlRouterProvider
como obsoleta. Ahora recomiendan usar en su UrlService
lugar. Puede lograr el mismo resultado con la siguiente modificación:
$urlService.rules.otherwise('/defaultState');
Métodos adicionales: https://ui-router.github.io/ng1/docs/1.0.16/interfaces/url.urlrulesapi.html
Las referencias de respuesta aceptadasangular-route
preguntan sobre ui-router
. La respuesta aceptada usa el "monolítico" $routeProvider
, que requiere el ngRoute
módulo (mientras que ui-router
necesita el ui.router
módulo)
En su lugar, se usa la respuesta con la calificación más alta$stateProvider
, y dice algo como .state("otherwise", { url : '/otherwise'... })
, pero no puedo encontrar ninguna mención de "lo contrario" en la documentación que vincula . Sin embargo, veo que $stateProvider
se menciona en esta respuesta donde dice:
No puedes usar solo
$stateProvider
. Necesitas inyectar$urlRouterProvider
Ahí es donde mi respuesta podría ayudarte. Para mí, fue suficiente usarlo $urlRouterProvider
así:
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');
//...
}]);
Mi sugerencia es consistente con la ui-router
documentación , ( esta revisión específica ), donde incluye un uso similar de. when(...)
método (la primera llamada a la función):
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');
})
$stateProvider.otherwise
, así que me ayudará)