angularjs $ location和window.history.pushState

时间:2015-07-13 13:25:29

标签: javascript angularjs angularjs-scope route-provider

我的角度应用的网址是这样的:

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/4window.history.pushState更改$location地址栏中的网址?

1 个答案:

答案 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的文档,并浏览一些有角度的文档。听起来你正试图将传统的推送状态使用和角度使用混合在一起。