无法使用 Angular 服务处理 onbeforeunload 事件

2024-04-03

我有以下回调onbeforeUnload我的一项服务中的事件。 在我的app.run我有块:

window.onbeforeunload = Services.beforeWindowClose;

这个方法是在一个服务中:

this.beforeWindowClose = function (event) {
            var currentState = $state.current.name;
            if (currentState !== constant.LOGOUT) {
                $rootScope.$broadcast("close");
                if (Utilities.isSavePending)
                    event.returnValue = constant.MSG;
            }
        }

在我的控制器中我有:

$scope.$on("close", function () {
            Utilities.isSavePending = vm.save; //sets it to true
        })

现在考虑到事件在角度上是同步的,这段代码应该在窗口关闭时给我一个弹出窗口。然而,这直接关闭了我的窗口。

我的意图是,每当用户关闭窗口时,我都会引发一个事件并查看控制器中是否有任何未保存的数据。如果有一些未保存的数据,浏览器不应关闭并弹出窗口,而如果没有未保存的数据,则浏览器应关闭。

我做错了什么或者理解错了吗?


在你的模块中run函数,你必须声明beforeunload事件是这样的:

.run(['$window', 'Utilities', function($window, Utilities) {  
  $window.addEventListener('beforeunload', function(e)         
     // Place code here
  };       
});

不是这样:

.run(['$window', 'Utilities', function($window, Utilities) {  
    window.onbeforeunload = function() {         
     // Place code here
    };
}]);

这是一个要使用的片段onbeforeunload与 Angular 的事件。

Note:根据您的浏览器,点击后代码片段将不起作用保存项目按钮,然后您尝试关闭此窗口。然后,您需要将代码粘贴到您自己的项目中。

附加信息

最近的 HTML 规范现在禁止自定义弹出消息,而是显示通用消息。

因此,始终可以阻止导航,但无法再指定自定义消息

这始终适用于 IE11,但不会持续很长时间(直到下一次更新)。

关于此的 HTML 规范:https://html.spec.whatwg.org/multipage/browsers.html#unloading-documents https://html.spec.whatwg.org/multipage/browsers.html#unloading-documents

关于此的 Chrome/Safari 文档:https://www.chromestatus.com/feature/5349061406228480 https://www.chromestatus.com/feature/5349061406228480

angular.module('app', []);

angular
  .module('app')
  .controller('ExampleController', ['$scope', 'Utilities', 'ItemService', function($scope, Utilities, ItemService) {
    // Expose Utilities to make pending state available in template
    $scope.Utilities = Utilities;
    // Use item service to save our item
    $scope.save = function() {
      ItemService.saveItem();
    }
    $scope.fireCloseEvent = function() {
      $scope.$emit('close');
    }
    $scope.$on('close', function(event) {
      Utilities.toggleSavePending();
    });
  }])
  .factory('ItemService', ['Utilities', function(Utilities) {
    return {
      saveItem: function() {
        // ...
        // Toggle global save pending state
        Utilities.toggleSavePending();
      }
    }
  }])
  .factory('Utilities', function() {
    var savePending = false;

    return {
      toggleSavePending: function() {
        savePending = !savePending;
      },
      isSavePending: function() {
        return savePending;
      }
    }
  })
  .run(['$window', 'Utilities', function($window, Utilities) {

    $window.addEventListener('beforeunload', function(e) {
      // If save pending state is truthy, prevent browser window from closing
      if (Utilities.isSavePending()) {
        var message = 'Warning! Save pending...';
        e = e || window.event;
        if (e) {
          e.returnValue = message;
        }
        return message;
      }
    });

  }]);
<!doctype html>
<html lang="en" ng-app="app">

<head>
  <meta charset="utf-8">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.min.js"></script>
  <script src="script.js"></script>
</head>

<body ng-controller="ExampleController">

  <button ng-click="save()" ng-disabled="Utilities.isSavePending()">Save item</button>
  <button ng-click="fireCloseEvent()">Fire Close Event</button>
  <div ng-if="Utilities.isSavePending()">A message should be displayed when you close the window</div>
</body>

</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Angular 服务处理 onbeforeunload 事件 的相关文章

随机推荐

  • 修改VCL组件代码

    我需要更改组件中的功能 当您收到 您无法覆盖此 消息 或者您需要更改私有方法中的代码 基类中不存在该方法 消息 导致组件无法下降时 您该怎么办 如果我遇到这个问题 我首先尝试从组件或其 CustomXXX 祖先继承 看看是否可以解决问题 如
  • 如何在_Layout视图中访问UserProfile

    在我的 MVC 应用程序中 我有一个共享的 Layout cshtml 文件 用于显示用户的菜单 在该视图上 我想显示来自 UserProfile 实体的信息 使用 SimpleMembership 创建 因此链接到可以在 Layout 页
  • 在 Cordova 应用程序中播放音频

    我正在使用 Cordova 媒体插件在我的移动应用程序中播放音频 我尝试了很多代码 但我没有弄清楚我在底部做错了什么 我放了两段我尝试过的代码 第一个代码 js代码在单独的文件中 var app initialize function th
  • Windows 7 上的 XAMPP 无法正常工作

    我刚刚在 Windows 7 上安装了 XAMPP lite 我有两个驱动器 C 用于操作系统和常规文件 以及外部驱动器 E 我在 E 根目录 上安装了 XAMPP lite 但它一直给我带来问题 Apache 工作得很好 但 MySQL
  • Apache Netbeans 10 CVS 插件不可用?

    我最终升级到 Apache Netbeans 10 从 8 2 并想像往常一样使用菜单安装 CVS 插件Tools gt Plugins gt Available Plugins 但是 我似乎无法找到 访问该插件 在 设置 中 我激活了 N
  • JQuery tablesorter pager 插件在 Edge 模式下无法与 IE11 正常工作

    如果您使用带有分页器的 Tablesorter Jquery 插件 则表上的添加将不会显示任何数据 数据就在那里 但它是隐藏的 我怀疑该插件的浏览器功能检测方法无法处理IE11 还有其他人遇到这个吗 看来IE11的userAgent有问题
  • 使用 snmp 代理注册 OID

    我正在尝试使用 snmp4j 模拟 SNMP 代理 我正在尝试向代理注册 MO 下面是代码片段 static final OID mo1 new OID 1 3 6 1 4 1 1234 1 104 static final OID mo2
  • 在 Coq 中,“if then else”允许非布尔第一个参数?

    我读过一些教程if a then b else c代表match a with true gt b false gt c end 然而 很奇怪的是 前者不检查类型a 而后者当然确保a是一个布尔值 例如 Coq lt Check if nil
  • java中的内存文件系统

    我想用Java创建一个简单的内存文件系统 它有一个根目录 并且能够创建新的子目录 在该目录中 我们可以创建新文件 写入文件 读取文件 删除文件以及重命名文件 您能否提供一些从哪里开始的建议 简单的代码或资源 自定义文件系统提供程序必须实现
  • 临时值在此语句结束时被释放[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Select 箱子抓取网页 let document Document from read response unwrap for node in document find Class lia
  • HTML5 视频,如果没有 .ogv 文件,则回退到 Flash

    如果不存在必要的文件类型 如何回退到 Flash 视频播放器 例如这段代码
  • 我可以在为服务器提供 API 的同时提供静态文件吗?

    所以我对网络开发还很陌生 现在我和我更加面向网络的朋友开始了一个项目 他向我扔了各种各样的框架 我们正在做 Vuejs jade stylus 和 jeet 对于新手来说 这当然非常令人困惑 因为没有 Vuejs 示例使用 jade 没有
  • 绘制三角形 iOS

    下面的代码画了一个圆圈 我如何修改现有代码来画一个三角形 colorDotLayer CALayer layer CGFloat width self bounds size width 6 colorDotLayer bounds CGR
  • 为什么我的充电状态接收器总是返回 false?

    我试图检测用户何时插入 或拔出 设备进行充电 在我的接收器中 当我确定它是否已插入时 我总是得到 错误 的状态读数 这是我的代码 在清单中
  • 如何在 shell 中解析长格式参数?

    我所看到的一切都使用getopt或者稍微花哨一点的getopts仅支持单字符选项 例如 h但不是 help 我想做一些花哨的长选择 我做过类似的事情this http blogger ziesemer com 2010 01 dyndns
  • 带有变量的 Swift 闭包导致内存泄漏

    我正在调试我的程序 发现内存泄漏问题 在ViewController中 当它弹出时 应该调用deinit函数 但事实并非如此 所以我尝试通过以下步骤来解决这个问题 通过注释多行 我发现以下几行使得 ViewController 没有释放 v
  • TimeZoneInfo.ConvertTimeToUtc 问题

    我们遇到一个问题 一位开发人员创建了以下代码 并且该代码可以在他的 DEV 环境中运行 但是当它被签入 QA 时 代码会中断并显示以下错误消息 myRecord UTCStartTime TimeZoneInfo ConvertTimeTo
  • 并行下载多个文件,就像 Android 中的 Whats App 一样

    我已经知道使用服务 意图服务我们下载多个文件在背景中 但这个问题还有一个更复杂的问题需要解决 我必须在不同的活动中并行下载多个视频 图像 例如 Whatsapp 我在什么应用程序中看到我们可以开始下载 然后我们可以在不同的屏幕上移动或按主页
  • Sublime Text 如何将包添加到全局存储库

    我为 sublime 创建了一个插件 并将其称为 sublimecastling 主要思想是替换 2 个选定的字段 因此 我很高兴知道是否可以将其添加到您的 Sublime 存储库中 以便用户可以通过包控制安装该插件 下面提供了 githu
  • 无法使用 Angular 服务处理 onbeforeunload 事件

    我有以下回调onbeforeUnload我的一项服务中的事件 在我的app run我有块 window onbeforeunload Services beforeWindowClose 这个方法是在一个服务中 this beforeWin