Javascript AngularJS+;UI路由器-在HTML5模式下手动键入URL,无需HashBang
我目前正在使用AngularJS和UI路由器进行状态管理,并在后端使用express 我目前已经启用了hash-bang模式,并且一直在试图找到一种解决方案,允许您在地址栏中手动键入URL,而不必使用hash-bang 因此,例如,不要键入: www.mysite.com/#/第1页 我想打字 www.mysite.com/page1 我尝试过启用HTML5模式: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('!'
$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,但未指定父路由)。这可能是另一个问题:/