如何从不同组件关闭AngularJS的$mdDialog弹窗?
实现组件内关闭$mdDialog弹窗的方案
其实核心思路就是把$mdDialog的关闭能力传递给弹窗组件,让组件内部能直接触发关闭逻辑。下面分步骤给你讲具体实现:
1. 打开弹窗时传递关闭方法
在CardKnowledgeDBComponent.ts的launchContactActivityPopup()方法里,修改$mdDialog.show()的配置,通过locals和控制器把关闭方法传给弹窗组件:
launchContactActivityPopup() { this.$mdDialog.show({ // 模板里绑定要传递的关闭方法 template: '<register-contact-activity-popup close-dialog="vm.closeDialog"></register-contact-activity-popup>', controller: function($mdDialog) { const vm = this; // 封装关闭弹窗的方法 vm.closeDialog = () => { $mdDialog.cancel(); // 用cancel关闭,也可以用hide传递返回数据 }; }, controllerAs: 'vm', clickOutsideToClose: true }); }
2. 弹窗组件接收并调用关闭方法
在<register-contact-activity-popup>组件的定义中,添加绑定属性接收这个方法,然后在组件的cancel()里调用它:
angular.module('你的模块名').component('registerContactActivityPopup', { // 用&绑定接收父级传递的方法 bindings: { closeDialog: '&' }, template: ` <!-- 你的弹窗内容 --> <button ng-click="$ctrl.cancel()">Cancel</button> `, controller: function() { const ctrl = this; // 组件内部的cancel方法,调用传递过来的关闭逻辑 ctrl.cancel = () => { ctrl.closeDialog(); }; } });
额外说明
- 如果需要关闭弹窗时向父组件传递数据,可以把
$mdDialog.cancel()换成$mdDialog.hide(你的数据),然后在launchContactActivityPopup()里用.then()接收:this.$mdDialog.show(/* 配置 */) .then(result => { // 处理返回的数据 }); - AngularJS会自动把模板里的kebab-case属性(比如
close-dialog)转换成组件绑定里的camelCase(closeDialog),注意保持名称对应一致。
内容的提问来源于stack exchange,提问作者Peter Boomsma
相关产品推荐
相关产品推荐

