如何在$mdDialog通过ESC或点击外部关闭时传递对象?
在$mdDialog通过ESC/外部点击关闭时传递对象的实现方案
当然可以实现!虽然官方文档没把这个细节明确列出来,但有两种靠谱的方法能搞定这个需求,下面给你详细拆解:
方法一:利用onRemoving回调(推荐)
这个回调是Angular Material提供的钩子,会在dialog即将被移除时触发——不管是按下ESC、点击外部区域,还是主动调用$mdDialog.hide()/cancel()。你可以在这个回调里返回要传递的对象,它会被自动传递给dialog promise的对应处理分支。
举个实际的代码例子:
// 打开dialog的业务代码 $mdDialog.show({ templateUrl: 'your-dialog.html', controller: 'YourDialogCtrl', escapeToClose: true, // 保持ESC关闭功能 clickOutsideToClose: true, // 保持外部点击关闭功能 onRemoving: function() { // 返回你要传递的自定义对象 return { action: 'cancelled', payload: { someKey: 'someValue' } }; } }).then(function(confirmResult) { // 这里处理主动调用$mdDialog.hide()时的返回值 console.log('Dialog confirmed:', confirmResult); }, function(cancelResult) { // ESC/外部点击触发的关闭,会进入这个分支,拿到onRemoving返回的对象 console.log('Dialog cancelled via ESC/outside click:', cancelResult); });
这种方法最省心,不需要手动监听事件,完全利用框架的原生钩子,代码简洁还不容易出问题。
方法二:自定义ESC和外部点击的处理逻辑
如果需要更灵活的控制(比如关闭前加个确认提示),可以禁用默认的关闭行为,自己监听事件并调用带参数的关闭方法。
代码示例如下:
// 打开dialog时禁用默认关闭行为 $mdDialog.show({ templateUrl: 'your-dialog.html', controller: 'YourDialogCtrl', escapeToClose: false, clickOutsideToClose: false, controllerAs: 'vm' }); // 对话框控制器里的代码 angular.module('yourApp').controller('YourDialogCtrl', ['$mdDialog', '$document', function($mdDialog, $document) { const vm = this; let escListener, clickListener; // 初始化事件监听 function initListeners() { // 监听ESC键 escListener = $document.on('keydown', (e) => { if (e.keyCode === 27) handleClose(); }); // 监听外部点击(判断点击目标是dialog容器) clickListener = $document.on('click', (e) => { if (angular.element(e.target).hasClass('md-dialog-container')) handleClose(); }); } // 统一处理关闭逻辑 function handleClose() { // 清理事件监听,避免内存泄漏 $document.off('keydown', escListener); $document.off('click', clickListener); // 调用cancel()并传递自定义对象,也可以用hide()对应promise的then分支 $mdDialog.cancel({ action: 'cancelled', payload: vm.dialogData }); } // 主动关闭按钮的逻辑(可选) vm.closeDialog = handleClose; // 控制器初始化时绑定监听 initListeners(); }]);
这种方法适合需要额外业务逻辑的场景,比如关闭前验证表单状态,或者弹出确认框询问用户是否真的要关闭。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

