AngularJS + UI-Router - 在没有HashBang的HTML5模式下手动键入URL

时间:2014-10-09 19:36:18

标签: javascript html5 angularjs angular-ui-router

我目前正在使用AngularJS和UI-Router进行状态管理,并在后端表达。

我目前启用了哈希爆炸模式,并且一直在尝试找到一种解决方案,允许您在地址栏中手动输入没有哈希爆炸的URL。

例如,而不是输入:

www.mysite.com /#!/第1页

我希望能够输入

www.mysite.com/page1

我试过启用html5Mode:

$locationProvider.html5Mode(true)
                 .hashPrefix('!');

但它仍然无法奏效。完成上述更改后,点击任意网址即可重新编写并更改'#!/ page1'到' / page1'。哪个好。

但是,使用' / page1'手动输入网址不起作用,并给出无效的路径错误。如果我用哈希爆炸键入它,即'#!/ page1'然后它工作,并重新写入URL作为' / page1'页面加载后。

那我在这里做错了什么?

我的州看起来像这样:

state('login', {
            url: '/login',
            templateUrl: 'login.html'
        }).
   state('parent', {
            url: '/hello',
            abstract: true,
            template: '<ui-view/>'
        }).
    state('parent.home', {
            url: '',
            controller: 'SomeCtrl',
            templateUrl: 'page.html'
        }).
        state('parent.file', {
            url: '/bob',
            controller: 'SomeCtrl2',
            templateUrl: 'file.html'
        })

3 个答案:

答案 0 :(得分:4)

更新: 您的代码对我来说很好,我将失去经验,并认为这是一个服务器问题。

有几种方法可以解决这个问题,但据我所知它们只是服务器端。

using AngularJS html5mode with nodeJS and Express

How do I configure IIS for URL Rewriting an AngularJS application in HTML5 mode?

你不能直接进入路线的原因 - mywebsite.com/page1 是因为角度应用本身(位于index.html页面上)需要拦截/引导你到< b>我的空间的。这就是为什么你看到页面本身永远不会重新加载,视图只是在你的应用程序中发生变化。您也可以通过刷新页面来测试它。

你需要实现服务器端的一些东西,它接受你的请求(IE: / page1 )并将所有请求路由到index.html,Angular将负责其余的工作。

另外:当您使用#/ page1时,您仍在请求索引页面,angular会识别#并相应地路由

编辑:其他信息

答案 1 :(得分:1)

这是因为/hello是服务器上的404。我的路线底部有一个笼子:

app.route('/*')
  .get(function(req, res) {
    res.sendfile(app.get('appPath') + '/index.html');
  });

答案 2 :(得分:0)

state('parent', { url: '/hello/', abstract: true, template: '<ui-view/>' })

的末尾使用斜杠

示例:

$ echo "all to out" >&2
all to out
$ echo "all to err" >&2
all to err
$ echo "err to out" 2>&1
err to out
$ echo "out to err" 1>&2
out to err