Javascript angularjs$location和window.history.pushState
我的angular应用程序的URL如下所示:Javascript angularjs$location和window.history.pushState,javascript,angularjs,angularjs-scope,route-provider,Javascript,Angularjs,Angularjs Scope,Route Provider,我的angular应用程序的URL如下所示: 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/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
^
当用户保存项目并且项目id为0时,我基本上只调用服务器端脚本,它返回新创建项目的项目id(比如,“3”)。然后,我用脚本返回的项目id更新地址栏中的URL,如下所示:
window.history.pushState({}, "URL updated", '/project/edit/'+new_project_id);
这将在不重新加载页面的情况下更改地址栏中的URL(因此,如果用户按save,地址栏中的URL将自动更改为http://www.domain.com/project/edit/3
这也是稍后编辑项目的URL)
但最近我在我的应用程序中添加了$routeProvider
(我在URL末尾使用散列语法#/step1
,#/step2
,#/step3
来管理视图)
现在,每当我调用window.history.pushState时,我都会收到infidig
错误,而且$routeProvider
只是将页面重定向/重新加载到http://www.domain.com/project/edit/0#/step1
而不是更改地址栏的URL
我尝试使用$location.path
更新我的URL,但这会更改哈希符号(/step1
部分)之后的部分,而我想更改
符号(/edit/0
到/edit/4
等)之前的部分
因此,我的问题是如何使用$location
或$route
?更改地址栏中的URL,如window.history.pushState
?
首先,我建议您签出,因为它的功能比angular的内置路由提供程序有了很大的改进,例如状态管理和嵌套视图
其次,在散列之前,您实际上不会更改URL结构。散列(如果使用此方法)应基于angular的根url构建,因此http://www.domain.com/#/
。那么在您的情况下,您将拥有http://www.domain.com/#/project/edit/1
使用ui路由器,您可以创建状态
,这些状态本质上是路由。例如,您可以创建一个类似于:
$stateProvider
.state('project_edit'{
url:“/project/edit/:id”,
templateUrl:“project.tpl.html”,
控制器:ProjectEditController
})
})
在您的控制器或服务中,在您发出请求并收到项目id后,您只需使用$state.go('project_edit',{id:1})
调用$state
服务,您将被带到ProjectEditController
控制器,其中id
可用
我建议阅读ui路由器的文档,并浏览一些角度文档。听起来你在尝试混合传统的推送状态用法和角度用法。p.S.我也尝试过使用$locationProvider.html5Mode(true),但这不起作用。谢谢回复。。是的,我用过ui路由器,我认为它很棒,尤其是嵌套视图。。我现在就试着用它。无论如何,你是对的,我可以在散列之后移动项目id,这绝对是一种方法,但现在我想保持URL与当前命名方案一致
/edit/project/project\u id
。。如果没有任何结果,那么我可能会将旧URL重定向到新URL,但如果能在散列之前了解如何更改项目id,那就太好了(可以使用window.history.pushState..只需要找出angularJS的方法)