失去焦点时自动关闭 ExtJS 窗口

Emi*_*ary 1 javascript extjs extjs5 extjs6

我有一个可以在我的应用程序中打开的小窗口,它允许用户执行琐碎的任务,当用户在窗口外单击时,我想简单地关闭它。一些示例建议在背景“掩码”上侦听单击事件- 除了感觉有点笨拙之外,这不是一个选项,因为窗口未配置为modal因为它的功能是非阻塞的,我不想限制它背后的用户界面。

我最初试图挂钩该blur事件,但是在 ExtJS 5+ 中行为是喜怒无常的,使用以下示例(小提琴),尝试在窗口外拖动或单击。

var win = Ext.create('Ext.window.Window', {
    width: 500,
    height: 250,
    items: {
        xtype: 'box',
        padding: 20,
        html: 'Test window...'
    }
});
win.on('blur', win.close, win);
win.show();
Run Code Online (Sandbox Code Playgroud)
  • 5.1.0  到5.1.1 中,  这完全失败。
  • 5.1.2  到6.2.0 中,  这可以工作,但如果您尝试按标题拖动,则会意外关闭。

是否有一些其他配置或一个巧妙的解决方案可以涵盖这两个问题,跨版本?

Emi*_*ary 5

focus我没有与组件的状态作斗争,而是选择了以下 MVC 设置,它侦听全局单击事件,然后确定用户是否单击了窗口。

Ext.define('App.window.DismissableWindow', {
    extend: 'Ext.window.Window',
    controller: 'dismissableWindow'
    // config ...
});
Run Code Online (Sandbox Code Playgroud)
Ext.define('App.window.DismissableWindowController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.dismissableWindow',

    listen: {
        global: {
            mousedown: 'dismissWindowCheck'
        }
    },

    dismissWindowCheck: function(ev){
        var view = this.getView();
        if(!view.owns(ev.getTarget()))
            view.close();
    }
});
Run Code Online (Sandbox Code Playgroud)

» 小提琴