2015-09-11 22 views
0

我一直在使用ExtJS一段時間,但現在正嘗試將我的項目轉換爲正確使用他們推薦的MVC風格。在initComponent中聲明時沒有調用控制器方法的事件偵聽器

我有一個視圖和一個控制器。我試圖爲boxready聲明一個事件監聽器來調用一個控制器方法。當我在initComponent內部聲明監聽器時,這不起作用 - 它說,當我期待它在我的控制器中查找該方法時,它無法在我的視圖中找到該方法。

見的jsfiddle這裏例如(相關代碼在MyPanel.js):senchafiddle

+1

建議你閱讀此線程:https://www.sencha.com/forum/showthread.php?300377 –

回答

1

無需附加內initComponent聽衆,做聲明:

listeners: { 
    boxready: 'controllerMethodName' 
} 

聲明這個直接上你的看法。

1

你可以像Brandon提出的那樣做。我認爲這也是Sencha在文檔中的含義。

我這樣做有點不同,因爲我不知道關於控制器的觀點。關於你的例子,意思是:視圖不應該知道控制器內部或應該有一個test()函數。看看在控制器內的init():

Ext.define('MyApp.view.MyPanelController', { 
    extend: 'Ext.app.ViewController', 
    alias: 'controller.mypanel', 

    init: function() { 
     this.getView().on("boxready",this.test, this); 
    }, 

    test: function() { 

     Ext.Msg.alert('hi'); 
    } 
}); 

,很少在查看:

Ext.define('MyApp.view.MyPanel', { 
    extend: 'Ext.form.Panel', 
    xtype: 'mypanel', 
    controller: 'mypanel', 

    html: 'sometext', 
    title: 'sometitle' 
}); 

這可能有一些缺點,我不知道。

退房此相應sfiddle: https://fiddle.sencha.com/#fiddle/tpm

+0

可以說,VC和觀點在本質上,再加。所以我認爲這樣做是沒有道理的。 –

+0

是的,它們通過「控制器」屬性連接。但我不明白爲什麼視圖應該知道控制器的功能。控制器的工作是根據視圖觸發的操作進行操作,然後相應地更改視圖。如果視圖告訴控制器對事件作出什麼反應,則視圖控制控制器。 –

+0

該視圖並不知道控制器的實現,只是有一個可用於委託的接口。這種耦合失去了,你可以通過簡單的實現相同的方法來輕鬆地改變控制器。 –

相關問題