我的角度应用的网址是这样的:
http://www.domain.com/project/edit/0#/step1 //create new project if project_id = 0
^
http://www.domain.com/project/edit/1#/step1 //edit existing project if project_id > 0
^
http://www.domain.com/project/edit/2#/step1 //edit existing project if project_id > 0
^
当用户保存项目并且project_id为0时,我基本上只调用服务器端脚本并返回新创建的项目的project_id(例如," 3")。然后,我使用脚本返回的project_id更新地址栏中的URL,如下所示:
window.history.pushState({}, "URL updated", '/project/edit/'+new_project_id);
这会更改地址栏中的URL而不重新加载页面(因此,如果用户按下了save,地址栏中的URL将自动更改为http://www.domain.com/project/edit/3
,这也是稍后编辑项目的URL)
但最近我已将$routeProvider
添加到我的应用中(我在结束时使用哈希语法#/step1
,#/step2
,#/step3
用于管理视图的URL)。
现在,每当我致电infidig
时,我都会收到此window.history.pushState
错误,$routeProvider
只会将页面重定向/重新加载到http://www.domain.com/project/edit/0#/step1
,而不是更改地址栏的网址。
我已尝试使用$location.path
更新我的网址,但是当我想在{{1}之前更改部分时,会更改哈希符号(#/step1
部分)之后的部分}签名(#
到/edit/0
等)
所以我的问题是如何使用/edit/4
或window.history.pushState
更改$location
地址栏中的网址?
答案 0 :(得分:1)
首先,我建议您检查ui-router,因为它比路径提供程序中内置的角度提供了更多改进的功能,例如状态管理和嵌套视图。
其次,您确实不会在哈希之前更改URL结构。哈希(如果使用此方法)应该根据您的根网址建立角度,因此http://www.domain.com/#/
。那么在你的情况下,你会有http://www.domain.com/#/project/edit/1
使用ui-router创建states
,它们实际上是路由。例如,您可以创建一个:
$stateProvider
.state('project_edit', {
url: "/project/edit/:id",
templateUrl: "project.tpl.html",
controller: ProjectEditController
})
})
在您提出请求并收到项目ID后,在您的控制器或服务中,您只需使用$state
拨打$state.go('project_edit', {id : 1})
服务,即可转到{{1}控制器ProjectEditController
将可用。
我建议您阅读ui-router的文档,并浏览一些有角度的文档。听起来你正试图将传统的推送状态使用和角度使用混合在一起。