2014-01-02 4 views
11

Я пользуюсь https://github.com/angular-ui/ui-router библиотеки. При попытке доступа к индексной маршрута («/») Я перенаправлен на 404. Код:Домашний маршрут в ui-router

angular.module('cr').config(function($stateProvider, $urlRouterProvider) { 
    $stateProvider 
     .state('home', { 
      url: '/', 
      templateUrl: 'views/index.html' 
     }); 

    $urlRouterProvider.otherwise('/404'); 
}); 

Что случилось с этим кодом? Хотя, когда я использую ui-sref = «home», он работает, но URL-адрес выглядит как «/ # /», но когда пользователь вводит имя сайта, он использует только имя домена, например «mysite.com», а не «mysite.com/#/'

ответ

31

Вы указали, как вести себя, если есть неизвестный/другой маршрут предоставляется - перейдите на страницу /404.

Но мы также должны определить, как вести себя, когда доступен какой-то ожидаемый, но не «точный»/«неизвестный» маршрут, т.е. создать псевдоним

Вот где .when() может/должен быть использован:

... 

// the known route, with missing '/' - let's create alias 
$urlRouterProvider.when('', '/'); 

// the unknown 
$urlRouterProvider.otherwise('/404'); 
+1

Решила точно, что я имел сегодня! – DecafJava

+0

Для всех, кто использует '$ urlMatcherFactoryProvider.strictMode (false)', для необязательных завершающих косых черт, '$ urlRouterProvider.when ('', '/')' приведет к сбою по умолчанию по умолчанию. Вместо этого я проверяю пустую $ location.url() в моей другой функции и перенаправляет на состояние по умолчанию. См. Здесь: http://stackoverflow.com/a/40669255/490592 –

7

Там нет ничего плохого с кодом. Вы просто отсутствует явное состояние для 404. Попробуйте добавить это:

.state('404', { 
    url: '{path:.*}', 
    templateUrl: 'views/404' 
}); 

Чтобы избавиться от символа хэш (#) вам нужно вводить еще одну зависимость в вашей конфигурации модуля:

$locationProvider 

И использовать метод .html5Mode(), чтобы установить режим HTML5 истину, как так

$locationProvider.html5Mode(true); 

Кроме того, убедитесь, ваш сервер настроен, чтобы позволить Угловым обрабатывать ваши маршрутизации. Например, вот конфигурация Node/Экспресс, что позволяет выше метод работы:

app.get('*', routes.index); 

И в вашем index.js файла (или как вы настраиваете ваш node.js экземпляра):

exports.index = function(req, res){ 
    res.render('index'); 
}; 
1

Вот пример:

// the known route, with missing '/' - let's create alias 
$urlRouterProvider.when('', '/'); 

// Redirect any unmatched url to 404 view (without change location.hash) 
$urlRouterProvider.otherwise(function($injector) { 
    var $state = $injector.get('$state'); 
    $state.go('404', null, { 
     location: false 
    }); 

}); 

$stateProvider 
    // homepage views 
    .state('homepage', { 
     url: "/", 
     templateUrl: "views/homepage.html",    
     data: { 
      pageTitle: 'Home' 
     } 
     ... more here ... 
    }) 
    // 404 views 
    .state('404', { 
     url: "/404", 
     templateUrl: "views/404.html",    
     data: { 
      pageTitle: '404 Not found' 
     } 
    }); 
0

Самый простой способ для меня с UI-маршрутизатор давал поле адреса пустое значение:

 $stateProvider 
     .state('home', { 
      url: '', 
      templateUrl: 'views/homepage.html', 
      controller: 'AppCtrl' 
     }) 
Смежные вопросы