【问题标题】:ExtJS how to close a window from other function inside controllerExtJS如何从控制器内的其他功能关闭窗口
【发布时间】:2014-07-09 02:01:40
【问题描述】:

在我的controller (ExtJS 4.2.1) 中,我有一个函数可以创建这样的窗口:

refs: [{
        ref: 'holidayView',
        selector: '[xtype=holiday.view]'
    }],
    init: function (application) {
        this.control({
            '[xtype=holiday.view] button#btnPrint': {
                click: me.onPrint
            }
        });
    },
    onPrint: function () {

        var me = this;

        var window = Ext.create('Ext.window.Window', {
            title: 'My Window',
            itemId: 'myWindow',
            width: 300,
            height: 300,
            modal: true,
            layout: fit,
            items: [{
                xtype: 'panel'
            }]
        });

        window.show();

    },
    otherFunction: function () {
        var me = this;
        // here I need to close the window
        // I tried this:

        var window = me.getHolidayView().up('#myWindow'); // but its undefined
        // me.getHolidayView() is accesible

        // I also have tried this:
        var window = me.getHolidayView().down('#myWindow'); // also its undefined

    }

关于如何获取窗口组件以便我可以关闭它的任何线索?

谢谢-

更新:

我试过了,效果很好,但现在确定这是否是正确的方法:

 var win = Ext.WindowManager.getActive();
            if (win) {
                win.close();
            }

【问题讨论】:

    标签: extjs extjs4 extjs4.1 extjs4.2 extjs-mvc


    【解决方案1】:

    您的错误在以下行内:

    var window = me.getHolidayView().up('#myWindow');
    

    默认情况下,window 是浮动的,因此(默认情况下)不是所有者容器。这就是为什么您不能使用up()down() 查找它们的原因,因为它们不在该层次结构中。以下是访问窗口(或任何其他视图)的三种变体

    变体 A

    使用WindowManager 绝对没问题。此外,您可以从应用程序的每个部分执行此操作。这就是经理的目的(例如StoreManager

    var win = Ext.WindowManager.getActive();
    if (win) {
        win.close();
    }
    

    变体 B

    但是可能存在多个窗口的情况,现在WindowManager 仍然可以为您提供所有窗口,但如果您不确定活动窗口是否是您正在寻找的窗口,则需要对其进行迭代.这时,自动获取器——或调用 refs——变得很方便。首先,您需要确保您拥有自己的窗口视图或任何唯一标识符。现在您可以为您的窗口创建ref,就像您在示例中所做的那样。以下是使用不同选择器的示例:

    {
        ref: 'customWin',
        selector: 'window[itemId=anystring]'
    }
    

    请注意,以下选择器将查找具有名为itemId 的属性的window,该属性的定义类似于itemId:'anystring'。另请注意,如果 nit 尚不存在,则 ref 也可以创建窗口。有关更多信息,请参阅 refs 文档。另请注意,创建的 refs 是公开的,这意味着只需从应用程序中的任何位置获取控制器实例(我想您定义了 appProperty)并像这样调用创建的 getter

    App.appPropertyValue.getController('name').getCustomWin()
    

    变体 C

    最后但同样重要的是,您可以创建自己的 getter,就像 @incutonez 所做的那样。

    getMyWindow: function() {
      var myWindow = this.myWindow;
      if (!myWindow) {
        myWindow = this.myWindow = Ext.create('Ext.window.Window', {
          title: 'My Window',
          width: 300,
          height: 300,
          modal: true,
          layout: fit,
          items: [{
            xtype: 'panel'
          }]
        });
      }
      return myWindow;
    }
    

    【讨论】:

      【解决方案2】:

      我使用 Ext JS 的方式稍有不同,所以对此持保留态度...我什至不碰 refsinit 的东西,因为那感觉不对,但我将其保留在此示例中,因为我不知道 holidayView 是什么。我会这样做:

      refs: [{
        ref: 'holidayView',
        selector: '[xtype=holiday.view]'
      }],
      init: function (application) {
        this.control({
          '[xtype=holiday.view] button#btnPrint': {
            click: me.onPrint
          }
        });
      },
      onPrint: function () {
        var me = this;
      
        var myWindow = this.getMyWindow();
        if (myWindow) {
          window.show();
        }
      },
      
      getMyWindow: function() {
        var myWindow = this.myWindow;
        if (!myWindow) {
          myWindow = this.myWindow = Ext.create('Ext.window.Window', {
            title: 'My Window',
            width: 300,
            height: 300,
            modal: true,
            layout: fit,
            items: [{
              xtype: 'panel'
            }]
          });
        }
        return myWindow;
      },
      
      otherFunction: function () {
        var me = this;
        // here I need to close the window
        // I tried this:
      
        var window = me.getMyWindow(); // but its undefined
      }
      

      这对我来说更像是 OOP...我有一个 getter,而且我不必担心管理 ID...显然私有变量 myWindow 可能会成为问题,但感觉有了 getter 就更合适了,我可以重复使用这个窗口。

      【讨论】:

      • 听起来很有趣,正如你所说的问题是变量 myWindows,你必须非常小心,不要在其他控制器或应用程序的一部分上声明相同的变量名不是吗?
      • 你怎么看:var win = Ext.WindowManager.getActive(); if (win) { win.close(); }
      • 嗯,不......控制器应该有自己的范围,所以在其他类/控制器中使用myWindow应该没问题,因为如果你没有,它将是完全不同或未定义的东西t 设置它。
      • 说实话,我不喜欢它。 Ext.WindowManager.getActive() 就是不喜欢我。一个主要原因是,如果他们摆脱 WindowManager 会怎样?然后你的代码坏了。它也只会让我打开活动窗口...如果我打开了多个窗口怎么办?
      • 你完全正确!!感谢您的反馈。会给几个小时看看是否还有其他答案,然后选择你的。非常感谢
      猜你喜欢
      • 1970-01-01
      • 2023-01-24
      • 2011-11-22
      • 2015-03-07
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多