Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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$location和window.history.pushState_Javascript_Angularjs_Angularjs Scope_Route Provider - Fatal编程技术网

Javascript angularjs$location和window.history.pushState

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

我的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/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的方法)