在initComponent中声明时,事件侦听器不调用控制器方法

时间:2015-09-11 22:57:45

标签: javascript extjs model-view-controller extjs6

我一直在使用ExtJS,但现在我正在尝试将我的项目转换为正确使用他们推荐的MVC风格。

我有一个视图和一个控制器。我正在尝试为boxready声明一个事件监听器来调用控制器方法。当我在initComponent内声明监听器时,这不起作用 - 它说当我希望它在我的控制器中查找方法时,它无法在我的视图中找到该方法。

请参阅此处的jsFiddle(相关代码位于MyPanel.js中):senchafiddle

2 个答案:

答案 0 :(得分:1)

无需在initComponent中附加侦听器,以声明方式执行:

listeners: {
     boxready: 'controllerMethodName'
}

直接在您的视图中声明此内容。

答案 1 :(得分:1)

你可以像布兰登提出的那样做。我认为这也是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