为什么在视图的控制器中没有触发委托方法

Why delegate method is not fired in view's controller

我将按钮组件包含在 html,

{
    xtype: 'container',
    padding: 10,
    width: 560,
    html: '<div class="class1"><span >Enter value <input type="text"  id="unput1">to process</span></div>' +
    '<button class="button" type="button">Click me</button>'
},

并且我在该视图中创建了委托事件

listeners: {
    el: {
        delegate: 'button',
        click: 'onButtonClick'
    }
}

我将 'onButtonClick' 方法放在视图的控制器中(在视图的配置中正确定义为控制器:'mycontroler')。但是,出于某种原因,应用程序正在 MainController 中寻找此方法。

Ext.util.Event.getFireInfo(): MyApp.view.main.MainController

上没有名为“onButtonClick”的方法

当然,我可以简单地移动主控制器中的方法,但我不理解这种行为,因为它违反了 MVC 范式。谁能给我解释一下?

我无法准确重现您的问题,但我看到在我的示例中它在组件本身而不是侦听器中搜索函数。将范围设置为 'controller' 也会导致运行时异常。但是我没有移动函数,而是看到了以下选项作为替代方案。

1.) 你可以编写一个调用控制器中的函数

listeners: {
     el: {
         delegate: 'button',
         click: function () {
             this.component.controller.onButtonClick();
         }
     }
 }

2.) 您可以将侦听器移动到组件本身

// ...
controller: 'mycontroller',
items: [{
    xtype: 'container',
    padding: 10,
    width: 560,
    html: '<div class="class1"><span >Enter value <input type="text"  id="unput1">to process</span></div>' +
        '<button class="button">Click me</button>',
    listeners: {
        el: {
            delegate: 'button',
            click: 'onButtonClick'
        }
    }
}]

我还创建了一个fiddle:https://fiddle.sencha.com/#view/editor&fiddle/3chv

随时更新这个并展示你的星座。可能有人可以说出 fiddle / 定义的问题到底是什么。

除此之外,这个博客 post 可能会帮助您: https://www.sencha.com/blog/declarative-listeners-in-ext-js-5/