Javascript 不执行routeprovider的角度更改url

Javascript 不执行routeprovider的角度更改url,javascript,angularjs,single-page-application,angularjs-routing,route-provider,Javascript,Angularjs,Single Page Application,Angularjs Routing,Route Provider,我正在尝试创建类似facebook的模式窗口-例如,单击图像,它将在模式窗口中打开,url将从/更改为/img/dj27s\u D,而无需重新提交视图,当您关闭模式窗口时,url将返回到/ 我发现使用 var stateObj = { foo: "bar" }; history.pushState(stateObj, "page 2", "bar.html"); 将在下一次$digest时使应用程序崩溃。我也试过了 $location.path = ''; 但什么也没发生。如果我执行 $lo

我正在尝试创建类似facebook的模式窗口-例如,单击图像,它将在模式窗口中打开,url将从
/
更改为
/img/dj27s\u D
,而无需重新提交视图,当您关闭模式窗口时,url将返回到
/

我发现使用

var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");
将在下一次
$digest
时使应用程序崩溃。我也试过了

$location.path = '';
但什么也没发生。如果我执行

$location.path('/img/id')

$routeProvider将启动并更改视图。我不希望发生这种情况,只希望在打开模式时临时更改url。

我建议查看。您可能可以使用嵌套状态/嵌套视图执行所描述的操作,其中内部视图弹出模态。您可以根据需要为每个状态配置URL

编辑:可能有一种方法不使用UI路由器,但我还没有做到。也许与你有关

一个带有嵌套视图的UI路由器的简单部分示例,您可以将其放在控制器中:

$stateProvider.state('site', {
    url: "",
    templateUrl: 'app/parent.tpl.html',
    controller: 'ParentCtrl'
});

$stateProvider.state('site.child', {
    url: "/child",
    templateUrl: 'app/child.tpl.html',
    controller: 'ChildCtrl'
});
lastRoute = $route.current;
$scope.$on('$locationChangeSuccess', function (e) {
  if (window.location.href.match(/\/view/) || window.location.href === '/') {
    $route.current = lastRoute;
  }
});
然后在父模板中,放置以下类型的div:

<div ui-view></div>


将在父模板中加载子模板的位置。在子模板中,您可以尝试模式对话框。

您可以将路由器设置为使用上一个路由。例如,在您的控制器中:

$stateProvider.state('site', {
    url: "",
    templateUrl: 'app/parent.tpl.html',
    controller: 'ParentCtrl'
});

$stateProvider.state('site.child', {
    url: "/child",
    templateUrl: 'app/child.tpl.html',
    controller: 'ChildCtrl'
});
lastRoute = $route.current;
$scope.$on('$locationChangeSuccess', function (e) {
  if (window.location.href.match(/\/view/) || window.location.href === '/') {
    $route.current = lastRoute;
  }
});

如果
$route.current
未更改,则不会触发整页刷新。您可能希望执行一些regexp检查以保持URL空间整洁,以防止刷新,但这是一个很小的代价。

没有UI路由器有什么解决方案吗?如果没有,请你提供一个简单的例子。以下是一些可能对你有帮助的例子:我的目标是更改url,所以当你按“刷新”或“复制/粘贴”地址栏中的链接时,你将被重定向到实际页面,而不是弹出窗口。我不知道如何使用UI-Router实现这一点。当用户打开弹出窗口,然后单击“刷新”时,您希望用户使用弹出窗口还是不使用弹出窗口路由到页面?抱歉,响应太晚。我想让用户转到没有弹出窗口的页面。谢谢!这正是我所需要的:)!