ExtJS MVC:如何从动态控制器中删除处理程序

时间:2011-11-15 09:17:11

标签: model-view-controller extjs4

根据ExtJS4中新的MVC模式,我正在创建一个动态控制器,并遇到了一个小问题。我已经使用this.control方法将控制器附加到我的视图中。当第二次创建控制器(在我的导航中来回)时,我已经连接了几次。我的问题是:什么是销毁控制器或删除我通过this.control命令设置的所有监听器的最佳方法。

提前致谢 克里斯


我的新控制器的代码如下所示:

我像这样创建新的控制器:

var step1Controller = Ext.create("MyApp.controller.Step1Controller", {
    application : this.application
});
step1Controller.init();

在我的控制器的init函数中,我将控制器连接到这样的视图:

init : function() {
    this.addEvents(['step1completed','basecontructionaborted']);
    this.setupScreenLayout();
    this.getTmpConfiguredControlModelsStore().removeAll();
    this.application.fireEvent("addBreadCrumb", "Inbetriebnahme");
    this.application.fireEvent("addBreadCrumb", "Schritt 1/3");

    this.control({
        '#addmodelbutton' : {
            click : this.onAddBtnClick
        },
        '#modelviewer' : {
            modelselected : this.onPanelSelect
        },
        '#navigationcontainer #movemodelleftbutton' : {
            click : this.onMoveModelLeftClick
        },
        '#navigationcontainer #continuestep2' : {
            click : this.onContinueStep2Click
        },
        '#navigationcontainer #abortbutton' : {
            click : this.onAbortButtonClick
        }
    });

    console.log('[BaseConstruction | init] completed');
}

1 个答案:

答案 0 :(得分:1)

老问题,但我解决了半天的问题,所以我会发布我是如何绕过它的。这个问题似乎与我自己的问题非常相似。希望它对其他人有用。

我正在动态加载控制器/视图,并且所有侦听器都通过app.control连接到控制器的init()中。工作得很好,直到我开始反复破坏/初始化视图。监听器在view.destroy()之后保留在视图上,因此稍后在路上初始化它们会导致那些监听器(即渲染,点击等)触发两次。

这解决了我:

    app.control({
        'element': {
            beforerender: {
                fn: function(thing){
                    // beforerender stuff for thing

                    thing.on('select', function(this, record, item, index){
                        console.log('select fired');
                    });
                },
                single: true
            },
        }
    });

请注意附加到'beforerender'的“single:true”。这是关键部分。所有其他以前写的像'beforerender'的听众都被.on()移到了它里面。

干杯!