Como não alterar o URL quando mostrar a página de erro 404 com o roteador da interface do usuário

Quero mostrar a página de erro 404, mas também quero salvar o URL incorreto no local.

Se eu fizer algo assim:

$urlRouterProvider.otherwise('404'); $stateProvider .state('404', { url: '/404', template: error404Template }); 

o URL mudará para /404 . Como posso mostrar a mensagem de erro em URLs incorretas sem alterar o URL real?

Existe solução para este cenário. Nós usaríamos 1) um recurso nativo do ui-router e 2) uma configuração. Um exemplo prático pode ser observado aqui .

1) Um recurso nativo das definições de estado do roteador da interface do usuário é:

O url não é necessário. Estado pode ser definido sem a sua representação na localização.

2) Uma configuração é:

  • otherwise() para rotas inválidas , qual parâmetro não precisa ser uma string com url padrão, mas pode ser uma function também (cite) :

caminho String | Função O caminho do URL que você deseja redirect ou uma regra de function que retorna o caminho do URL. A versão da function é passada em dois parâmetros: $ injector e $ location

Solução: combinação destes dois. Nós teríamos state sem url e costume otherwise :

 $stateProvider .state('404', { // no url defined template: '
error
', }) $urlRouterProvider.otherwise(function($injector, $location){ var state = $injector.get('$state'); state.go('404'); return $location.path(); });

Verifique se todos neste exemplo de trabalho

A partir do ui-router#0.2.15 você pode usar $state.go() e enviar opção para não atualizar o local:

 $urlRouterProvider.otherwise(function($injector) { var $state = $injector.get('$state'); $state.go('404', null, { location: false }); });