ExtJS报错:view.main.MainController无samethod()方法的排查求助
听起来这个问题是ExtJS MVC机制里的控制器关联配置出了问题,我来帮你梳理几个可能的原因和解决办法:
1. 新窗口未正确指定关联的控制器
你之前的按钮能正常关联view.sa.sacontroller,大概率是因为那个按钮所在的组件已经配置了正确的controller属性。而新创建的窗口默认可能继承了上层组件的控制器(比如view.main.MainController),或者根本没指定控制器,导致ExtJS的事件查找机制自动指向了最上层的主控制器。
解决办法:在创建窗口时显式指定控制器,比如:
Ext.create('Ext.window.Window', { title: '新窗口', // 显式关联目标控制器 controller: 'view.sa.sacontroller', items: [{ xtype: 'button', text: '点击执行方法', // 如果用action绑定方法,会自动找当前窗口关联的控制器 action: 'samethod' }] });
注意:如果你的控制器配置了alias(比如alias: 'controller.sa'),也可以直接用别名controller: 'sa'来简化。
2. 按钮事件绑定的作用域或写法错误
如果你的按钮是用handler函数直接绑定,要确保调用的是view.sa.sacontroller里的方法,而不是默认作用域下的方法。比如:
// 先获取目标控制器实例 var saController = Ext.app.Application.instance.getController('view.sa.sacontroller'); Ext.create('Ext.window.Window', { items: [{ xtype: 'button', text: '点击执行方法', handler: function() { // 直接调用目标控制器的方法 saController.samethod(); } }] });
或者直接把handler指向控制器的方法,并指定作用域:
handler: saController.samethod, scope: saController
3. 检查命名空间和控制器注册是否正确
确认view.sa.sacontroller的类名拼写完全正确(ExtJS对类名大小写、路径非常敏感),并且该控制器已经被正确加载到应用中。可以在浏览器控制台执行Ext.ClassManager.get('view.sa.sacontroller'),如果返回undefined,说明控制器没有被正确注册或加载。
最后建议
对比一下之前正常工作的按钮所在组件的配置,看看它是如何关联view.sa.sacontroller的——是组件本身配置了controller,还是通过父组件继承的?把相同的配置逻辑复制到新窗口上,应该就能解决问题。
内容的提问来源于stack exchange,提问作者sandy

