Extjs 点击一次button触发多次请求

来源:互联网 发布:淘宝网址微信转换 编辑:程序博客网 时间:2024/05/16 12:24

今天偶然发现一个问题,ext的按钮点击一次以后进行了多次请求,一开始怀疑button会默认submit一次,再加上我采用的ajax请求,这样就会导致多次请求,后来发现我想错了,而且有个值得关注的现象:打开新页面,第一次打开窗口操作上面的button只会提交一次,成功后窗口会关闭;第二次打开窗口操作上面的button就会提交两次···以此类推。很奇怪···后来受到一篇文章的启发:

http://blog.sina.com.cn/s/blog_74a86d520101l10b.html

事件触发两次的三种原因:

1. 容器的多次初始化

隐蔽级别★★★

错误表现为在代码中将一个容器初始化了两次,例如

 var controller = coreApp.getController(treeNode.controller).init();

此行代码乍一看是正常的获取一个控制器然后初始化,其实getController方法已经将控制器初始化了,这时再调用init()方法就会注册两次,一般犯了一次这样的错误,看了源码以后就不会再犯了,毕竟每个项目里用到的地方不多.

2. 控制器的继承

隐蔽级别★★

错误表现为注册全局事件,在继承的子控制器内又注册事件,这是某论坛友人出现的错误,注意就好了.

3.容器注册控制器,同时在代码里又使用了getController方法而使得控制器的多次注册

隐蔽级别★★★★

这个错误隐蔽级别高的原因是用开发工具构建MVC时会自动默认注册容器,但因为它没有任何手动行为和显著提示,而导致人不太容易想到.

例如

 Ext.Loader.setConfig({
    enabled: true
});


Ext.application({
    models: [
        'MenuModel'
    ],
    stores: [
        'MenuStore'
    ],
    views: [
        'MyWindow'
    ],
    controllers: [
        'MainController',

        'DzController'
    ],
    name: 'Phidias',

    launch: function() {
        Ext.create('Phidias.view.InitViewport');
    }

});

而在编写菜单的时候我们经常会使用getController方法,所以被在不同的地方注册多次.

我的代码构造刚好是在一个页面内,点击了某个按钮,触发生成一个application,同时弹出窗口,由application下的一个controller控制窗口上的按钮,我猜想应该是在窗口关闭的时候controller或者application没有销毁,造成第二次打开窗口会再生成一个controller,而提交的时候这两个controller都会监听窗口的按钮操作,导致多次提交,于是尝试了各种方法在关闭窗口的时候销毁application或者controller,终于让我找到一个解决方法:

在controller的onlaunch方法里添加窗口关闭监听,close事件触发销毁application。成功搞定!代码如下:

onLaunch : function() {
var me = this;
var win = Ext.widget('orderGoodsEditWin');
win.addListener('close',function(panel, eOpts){
me.application.destroy();
});

···

}


共勉!

阅读全文
0 0