2012-05-07 49 views
1

在帶Ext.app.Controller的control()方法的ExtJS類中,我可以通過控制器的init()方法在通過Ext.ComponentQuery選擇的組件中添加偵聽器。如何使用ExtJS 4中控制器的控制方法更改範圍?

這樣做默認情況下,我的控制器範圍內我的處理函數。有沒有辦法在這裏指定其他範圍?

例如,在這種情況下:

Ext.define('BackOffice.controller.BaseList', { 
    extend: 'Ext.app.Controller', 

    refs: [ 
     // some refs 
    ], 

    init: function() { 
     this.control({ 
      'bo-list-view > toolbar > button[action=create-new]': { 
       click: this.onCreateNewClick 
      }, 

      'bo-list-view > toolbar > button[action=edit]': { 
       click: this.onEditClick 
      }, 

      'bo-list-view > toolbar > button[action=refresh]': { 
       click: this.onRefreshClick 
      } 
     }) 
    }, 

    // ... 
}); 

在處理函數我想知道確切的按鈕點擊執行基於此信息的一些行動。

我試過在範圍字段的按鈕聲明中指定範圍,這沒有幫助。

另外我想使用Ext.bind()來解決問題,但要綁定函數,我需要再次參考按鈕。

使用.on()添加偵聽器在init()中不起作用,因爲它在應用程序的啓動方法之前調用。

有沒有任何方法可以將監聽器添加到控制器保存範圍的按鈕?

更新

到按鈕的引用是作爲第一個參數到處理函數傳遞。 這解決了我的問題,但仍在尋找一種方法來定義control()方法內的作用域。

回答

1

如果你看click事件的描述:http://docs.sencha.com/ext-js/4-0/#!/api/Ext.button.Button-event-click你會看到第一個參數是指向按鈕的指針,即你不需要改變範圍 - 只需在你的函數中聲明參數,你就會知道按下了哪個按鈕。

+0

Ahh this()真是太遺憾了,我在最後時刻快速編輯了代碼並錯過了它,謝謝提及將修復示例。 – turan

+0

關於添加「scope:this」,在control()方法中不起作用,它說我只能在那裏指定處理程序。 在這種情況下使用第一個參數的按鈕,但不適用於沒有此功能的一些自定義第三方組件,所以我仍然有問題 – turan

+0

我絕對在我的很多控制器中使用'scope:this'。但實際上這樣做是爲了將範圍恢復到控制器類。如果你想指定某個按鈕作爲範圍 - 你甚至可以檢測到你需要的元素?你正在使用refs來訪問它。 – sha

2

您可以通過使用配置對象來實現更高級的作用域功能。

Ext.define('BackOffice.controller.BaseList', { 
    extend: 'Ext.app.Controller', 

    refs: [ 
     // some refs 
    ], 

    init: function() { 
     this.control({ 
      'bo-list-view > toolbar > button[action=create-new]': { 
       // This will call onCreateNewClick with global window as the scope 
       click: {fn: this.onCreateNewClick, scope: window} 
      }, 

      'bo-list-view > toolbar > button[action=edit]': { 
       click: {fn: this.onEditClick, scope: otherScopeObj} 
      }, 

      'bo-list-view > toolbar > button[action=refresh]': { 
       click: this.onRefreshClick 
      } 
     }); 
    }, 

    // ... 
}); 

我不知道是否所有正常的配置工作(即single:true),但範圍確實如此。