2

我正在尝试制作类似Facebook的模态窗口 - 例如,您单击图像,它会在模式窗口中打开并且URL从/更改为/img/dj27s_D,而不会重新渲染视图, modal的url可以追溯到/没有执行路线提供角度更改网址

我想通了,使用

var stateObj = { foo: "bar" }; 
history.pushState(stateObj, "page 2", "bar.html"); 

只会崩溃在下$digest应用。我也试过

$location.path = ''; 

但没有任何反应。如果我执行

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

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

回答

0

我建议你看看Angular UI-Router。你可以用嵌套的状态/嵌套视图来描述你所描述的内部视图弹出模态。您可以根据需要配置每个状态的URL。

编辑:可能有一种方法不使用UI-Router,但我没有这样做。也许this other SO question与你有关。在父模板

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

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

然后,把这种类型的div:

UI路由器与嵌套视图一个简单的部分示例,你把这个在您的控制器

<div ui-view></div> 

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

+0

有没有没有UI路由器的解决方案?如果不是,请提供一个简单的例子。 – Deepsy

+0

这里有一些例子可以帮助你:http://stackoverflow.com/a/22116618/675065 – Alp

+0

事情是,我的目标是改变网址,所以当你按刷新或复制/粘贴链接地址酒吧,你会被重定向到实际的页面,而不是弹出窗口。我无法弄清楚如何使用UI-Router来做到这一点。 – Deepsy

1

您可以设置路由器使用以前的路由。例如这种方式在你的控制器:

lastRoute = $route.current; 
$scope.$on('$locationChangeSuccess', function (e) { 
    if (window.location.href.match(/\/view/) || window.location.href === '/') { 
    $route.current = lastRoute; 
    } 
}); 

$route.current不会改变,刷新整个页面不会被触发。你可能希望做一些正则表达式检查来保持你的URL空间整洁以防止刷新,但这是一个小的代价。

+0

谢谢!这正是我需要的:)! – iMacTia