Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS+;UI路由器-在HTML5模式下手动键入URL,无需HashBang_Javascript_Html_Angularjs_Angular Ui Router - Fatal编程技术网

Javascript AngularJS+;UI路由器-在HTML5模式下手动键入URL,无需HashBang

Javascript AngularJS+;UI路由器-在HTML5模式下手动键入URL,无需HashBang,javascript,html,angularjs,angular-ui-router,Javascript,Html,Angularjs,Angular Ui Router,我目前正在使用AngularJS和UI路由器进行状态管理,并在后端使用express 我目前已经启用了hash-bang模式,并且一直在试图找到一种解决方案,允许您在地址栏中手动键入URL,而不必使用hash-bang 因此,例如,不要键入: www.mysite.com/#/第1页 我想打字 www.mysite.com/page1 我尝试过启用HTML5模式: $locationProvider.html5Mode(true) .hashPrefix('!'

我目前正在使用AngularJS和UI路由器进行状态管理,并在后端使用express

我目前已经启用了hash-bang模式,并且一直在试图找到一种解决方案,允许您在地址栏中手动键入URL,而不必使用hash-bang

因此,例如,不要键入:

www.mysite.com/#/第1页

我想打字

www.mysite.com/page1

我尝试过启用HTML5模式:

$locationProvider.html5Mode(true)
                 .hashPrefix('!');
但它仍然不起作用。通过上述更改,单击任何URL都将重新写入并从“#”更改位置/“第1页”到“/page1”。这很好

但是,手动输入带有“/page1”的URL无效,并且会出现无效路径错误。如果我用包含hash-bang的格式输入,即#/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'
        })
状态('login'{
url:“/login”,
templateUrl:'login.html'
}).
州('父'{
url:“/你好”,
摘要:没错,
模板:“”
}).
州('parent.home'{
url:“”,
控制器:“SomeCtrl”,
templateUrl:'page.html'
}).
状态('parent.file'{
url:“/bob”,
控制器:“SomeCtrl2”,
templateUrl:'file.html'
})
更新: 你的代码在我看来很好,我失去了经验,认为这是一个服务器问题

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

您无法直接进入route-mywebsite.com/page1的原因是angular应用程序本身(位于index.html页面上)需要拦截/引导您进入mypage。这就是为什么你会看到页面本身从未被重新加载,而浏览量只是在你的应用程序中发生变化。您也可以通过刷新页面来测试这一点

您需要在服务器端实现一些东西,接收您的请求(即:/page1),并将所有请求路由到index.html,Angular将处理其余的请求

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


编辑:附加信息

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

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

url:/path/

例如:

state('parent', {
    url: '/hello/',
    abstract: true,
    template: '<ui-view/>'
})
状态('parent'{
url:“/hello/”,
摘要:没错,
模板:“”
})

您是否尝试删除前缀?或者,你在做需要它的事情吗?我只有
$locationProvider.html5Mode(true)。是的,我做了,运气不好,所以正如livepo建议的那样,它可能是服务器端,我要尝试一下。好的地方,只是服务器端需要配置。既然你提到了原因,它点击了,我想我忽略了AngularJS的整个单页特性,以及在根目录上执行魔术的代码。实际上我说得太快了,子状态不起作用,即在我上面的示例中“/parent/child1”不起作用。我一片空白。控制台里有什么东西,或者没有信息吗?我以前遇到过嵌套路由变为空的问题,但那是因为我没有指定实际的父路由。(即有一个路由parent.child,但未指定父路由)。这可能是另一个问题:/