Angular UI-Router将根URL发送到404

时间:2014-05-02 23:56:51

标签: angularjs angular-ui-router

我对ui-router感到愤怒。一切都按我的意思运行,所有错误的URL都发送到404状态。但是,即使我的默认状态在网址为/#/时正确呈现,/的网址也会重定向到/404/。如何将default状态同时提供给//#/

app.js

MyApp.config( function ($stateProvider, $urlRouterProvider) {

// For any unmatched url, send to 404
$urlRouterProvider.otherwise("/404/");

$stateProvider
    // Home  (default)
    .state('default', {
        url: '/',
        resolve: {
            ...
        },
   }
});

2 个答案:

答案 0 :(得分:11)

我认为这将满足您的需求 -

MyApp.config(function($stateProvider, $urlRouterProvider) {
    // the known route
    $urlRouterProvider.when('', '/');

    // For any unmatched url, send to 404
    $urlRouterProvider.otherwise('/404');

    $stateProvider
        // Home  (default)
        .state('default', {
            url: '/',
            resolve: {
                // ...
            }
            // ....
        });
});

我指的是this post。您可能需要使用正则表达式来处理包含数据的路由。

您可以使用查询字符串代替网址中的#,并在状态中通过$stateParams抓取它。

以下是如何做到这一点 -

  // ....

  $stateProvider

    .state('default', {
        url: '/?data',
        templateUrl: 'templates/index.html',
        controller: 'defaultCtrl'
    })

然后您可以使用以下内容与数据一起回家 -

var toStateData = {
    key1: 'value1',
    key2: 'value2'
}

$state.go('default', {data: JSON.stringify(toStateData)});

您不必在$stateParams中对数据进行字符串化,但这将允许使用一个参数的更多选项。在defaultCtrl控制器中,您可以像这样获得传递的查询字符串 -

var stateData = JSON.parse($stateParams.data);
var key1 = stateData.key1;
// ....

答案 1 :(得分:2)

我想只对状态执行此操作,因此不涉及网址提供商。我发现以下解决方案我觉得很好:

(对不起它的coffeescript)

  $stateProvider.
    state('base.public.notFound',
      url:         '^*path'
      templateUrl: 'views/layouts/404.html'
    )

把它作为最后一个状态,你就完成了!