【问题标题】:Is it possible to make a custom "leaving page" confirmation?是否可以进行自定义“离开页面”确认?
【发布时间】:2014-06-15 21:52:03
【问题描述】:

我希望能够暂停执行,显示一个对话框,然后当按下某个按钮时,继续执行。

因此,如果用户在我的表单上,然后单击指向不同路线的链接,我希望显示我的对话框,然后如果他们点击该对话框上的确认按钮,则路线继续。

所以我知道有一个 $routeChangeStart 并且它有下一个路由作为第一个参数,但它只包含偶数的名称和一些范围。您可以使用 preventDefault 来停止路由,但我想知道是否有办法在以后继续路由?

所以最好在 routeChangeStart 中执行 event.preventDefault(),然后存储下一个,然后在用户点击确认后,我会选择“下一个”并重做路由。

如何重做路线? 我知道我可以使用 params 对象和 $location 在 originalPath 上执行 str_replace,但我想知道是否有更直接的方法来重新应用路由更改?

【问题讨论】:

  • @RobG 用于页面重新加载,在 Angular 中,更改路由而不更改 url(仅更改哈希)。
  • 如果没有人回答您的问题,那么最好的选择是查看路由器的来源,如果不允许这样做,则使用 Angular 1 作为基础创建您自己的路由器。
  • 感谢您的建议。我喜欢 90% 在写问题时解决了我的问题,但是解决方案看起来很混乱。还是解决方案还不错,可以按照你说的打包。
  • 天哪,我是个傻瓜。大多数人不鼓励 $routeChangeStart ,它使用 next 和 current 的复杂版本,但 $locationChangeStart 只是使用 next 和 current 的 url,从而使一个复杂化变得简单。我会发布一个答案并完成这个。感谢大家的帮助。

标签: javascript angularjs


【解决方案1】:

恐怕你无法避免字符串解析。

如果您想异步处理确认,您需要确实默认阻​​止该事件,请求用户确认,如果获得批准,设置一个标志并使用$location.url(...) 导航到请求的页面。

app.controller('myCtrl', function ($location, $scope, UserConfirm) {
    $scope.$on('$locationChangeStart', function (evt, next, prev) {
        if (!$scope.exitConfirmed) {
            evt.preventDefault();
            var url = extractUrl(prev, next);
            UserConfirm.confirm('Are you sure you want to leave ?').then(
                function (confirmed) {
                    if (confirmed) {
                        $scope.exitConfirmed = true;
                        $location.url(url);
                    }
                }
            );
        }
    });
    ...
});

extractUrl() 函数可能如下所示:

function extractUrl(prevAbsUrl, nextAbsUrl) {
    var idx = prevAbsUrl.length - $location.url().length;
    var withNumSign = nextAbsUrl.substring(idx);
    var pureUrl = withNumSign.substring(withNumSign.indexOf('/'));
    return pureUrl;
}

另请参阅此short demo

【讨论】:

  • 我认为您使我的问题过于复杂 =P 下一个解决方案,但事实证明我根本不需要字符串解析。我真的很感谢你试图解决我的问题。感谢您的辛勤工作。
  • @JasonMcCarrell:这与我在其中一个应用程序上解决相同问题的方式非常相似。我会对一个更简单的解决方案非常感兴趣,所以如果你有一个,请随时分享:)
【解决方案2】:

如果您使用 $locationChangeStart,则 next 和 current 只是表示您当前和未来目的地的完整 url 的字符串,因此不需要解析。

所以我的解决方案是:

function confirmLeaving(evt, next, current) {
  if(consideringClosing)  //ok we're allowed to leave now
    return;

  evt.preventDefault();  //Don't leave! Show dialog instead.

  $('#dialogCancel').modal('show');
  consideringClosing = true;  //if we try to leave again while dialog is up, thats fine.
}   

$scope.$on('$locationChangeStart', confirmLeaving);

然后在模式中,我有一个“关闭而不保存”按钮,它会将 $location 返回到项目列表,但现在我已将考虑关闭设置为 true,confirmLeaving 不会阻止用户。在模态中还有一个取消按钮,用于关闭模态并将考虑关闭设置回 false(因此模态将再次显示在 locationChange 上)。

【讨论】:

  • 好的,这与我使用的方法完全相同,只是您不解析下一个位置。但是如果用户确认,你如何导航到下一个位置?
  • 调用$location.path的“关闭而不保存”按钮上的点击事件,因为考虑到Clsoing现在为真,路由会发生。 “取消”按钮只是关闭模式并将考虑关闭设置回 false。
  • 你传递给 $location.path 什么?
  • 传递给 $locationChangeStart 的“下一个”参数
  • 你确定吗?我尝试$location.path(next),但它不起作用。你能准备一把小提琴吗? (只有$location.absUrl(next) 对我有用,但由于某种我不记得的原因我拒绝了它:))
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 2014-03-25
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多