【问题标题】:Angular change url without executing routeprovider不执行 routeprovider 的角度更改 url
【发布时间】:2014-04-03 18:24:05
【问题描述】:

我正在尝试制作类似 facebook 的模态窗口 - 例如,您单击图像,它会在模态窗口中打开,并且 url 从 / 更改为 /img/dj27s_D 而不重新呈现视图,当您关闭模态窗口时url 回到/

我发现使用

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

只会在下一个$digest 上使应用程序崩溃。我也试过了

$location.path = '';

但什么也没发生。如果我执行

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

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

【问题讨论】:

    标签: javascript angularjs single-page-application angularjs-routing route-provider


    【解决方案1】:

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

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

    $route.current 不变时,不触发整页刷新。您可能希望进行一些正则表达式检查以保持您的 URL 空间整洁以防止刷新,但这是一个很小的代价。

    【讨论】:

    • 谢谢!这正是我需要的:)!
    【解决方案2】:

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

    编辑:可能有不使用 UI-Router 的方法,但我没有这样做。也许this other SO question 与您有关。

    一个带有嵌套视图的 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'
    });
    

    然后在父模板中,放这种类型的div:

    <div ui-view></div>
    

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

    【讨论】:

    • 没有UI-router有什么解决办法吗?如果不是,请您提供一个简单的示例。
    • 这里有一些可能对你有帮助的例子:stackoverflow.com/a/22116618/675065
    • 问题是我的目标是更改网址,因此当您按下刷新或复制/粘贴地址栏中的链接时,您将被重定向到实际页面,而不是弹出窗口。我不知道如何使用 UI-Router 做到这一点。
    • 当用户打开弹出窗口然后点击刷新时,您希望用户路由到有弹出窗口的页面还是没有弹出窗口的页面?
    • 抱歉回复晚了。我希望用户在没有弹出窗口的情况下转到页面。
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多