2013-05-28 3 views

ответ

117

Вы не можете использовать только $stateProvider.

Вы должны вводить $urlRouterProvider и создать код, подобный:

$urlRouterProvider.otherwise('/otherwise'); 

/otherwise URL должен быть определен на состояние, как обычно:

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

Смотрите эту ссылку, где ksperling explains

+0

Я пробовал, и это сработало! таким образом, это лучший ответ;) – Adelin

+0

Фактически вы можете использовать '$ stateProvider'. Это меньше работает, если вы просто хотите отобразить шаблон, но не перенаправлять. Я предпочитаю ответ @ juan-hernandez. – weltschmerz

+0

означает, что значение, переданное 'в противном случае' (в данном случае' '/ else'') должно совпадать с именем состояния (первым параметром' .state') или значением параметра 'url'? – d512

3

Хорошо, глупый момент, когда вы понимаете, что вопрос, который вы задали, уже ответил в первых строках образца кода! Просто взгляните на образец кода.

 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

Вы можете с $stateProvider с помощью поймать всех синтаксис ("*path"). Вам просто нужно добавить состояние конфигурации в нижней части списка, как следующему:

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

Все опции объясняются в https://github.com/angular-ui/ui-router/wiki/URL-Routing#regex-parameters.

Приятная вещь этого варианта, в отличие от $urlRouterProvider.otherwise(...), заключается в том, что вы не вынуждены менять местоположение.

+0

не могли бы вы уточнить: 'вы не вынуждены менять местоположение? –

+1

Он имеет в виду, что URL-адрес останется таким, каким он был. Поэтому, если пользователь переходит к '/ this/does/not/exist', тогда URL-адрес останется таким же в адресной строке. Другое решение приведет вас к '/ else' –

+0

Я использовал ваше решение, и оно сработало (я могу сохранить URL-адрес, который не был найден, что отлично, потому что я использую http://luisfarzati.github.io/angulartics/ и таким образом, я также вижу навигацию к страницам, которые не были найдены) для случаев, когда URL-адрес, к которому пользователь переходит, не существует. Однако, если я перехожу к этому URL-адресу, используя $ state.go ('other') внутри контроллера, я теряю URL-адрес. Я перемещаюсь в явном виде к этому состоянию, когда пользователь переходит на страницу сведений о деталях, а сервер возвращает 404 (например, если элемент был удален). Вы знаете, как это исправить? – pcatre

31

Вы также можете вручную ввести $ state в другую функцию, после чего вы можете перейти к состоянию не-url. Это имеет преимущество браузера, не меняющего адресную строку, что полезно для обработки возврата к предыдущей странице.

$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

, который решил мою проблему о том, как проверить, являемся ли мы средним или загруженным, когда используется другое - большое вам спасибо :) –

+0

вы сохранили мою день! – Titmael

+0

Не забудьте, хотите ли вы минимизировать это значение? –

0

В accepted answer ссылки angular-route спрашивает о ui-router. Принятый ответ использует "monolithic"$routeProvider, который требует ngRoute модуля (в то время как ui-router необходим модуль ui.router)

highest-rated answer использует $stateProvider вместо этого, и говорит что-то вроде .state("otherwise", { url : '/otherwise'... }), , но я не могу найти ни одного упоминания о «иначе» в documentation it links. Тем не менее, я вижу, что $stateProvider упоминается in this answer, где он говорит:

Вы не можете использовать только $stateProvider. Вам необходимо ввести $urlRouterProvider

Вот где мой ответ может вам помочь. Для меня это было достаточно, чтобы использовать $urlRouterProvider так же, как это:

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'); 
        //... 
    }]); 

Мое предложение согласуется с ui-routerdocumentation, (this specific revision), где он включает в себя подобное использование из.when(...) (первый вызов функции):

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'); 
}) 

 Смежные вопросы

  • Нет связанных вопросов^_^