javascript - ExtJS 4 中函数处理程序内的作用域

标签 javascript extjs scope extjs4 handler

我搜索了一些关于范围问题的信息并找到了一些东西,但我不确定它们是否适合我的情况。我真的很困惑 atm,所以我想我不妨直接到论坛提问。

我有一个树面板。在该树面板内,我有一个 xtype: 'textfield' 的停靠项。该文本字段采用一个值,并通过specialkey 事件处理程序内的Ext.Ajax.Request 将其用作ajax 请求中的参数。服务器在其响应中返回一个 JSON 对象,该对象被解码并包含树节点的文件夹 ID。在 ajax 请求的 SUCCESS 配置中,有一个我想要运行的函数,它必须通过 getNodeById(IdFromAjaxResponse) 引用树的节点并展开它们。问题是我不知道如何引用这些节点。我尝试了 this.getStore().getNodeById 但结果发现“this”指的是窗口(我猜我的树面板容器???)。如何引用树面板或树商店?我不想使用 getCmp 等直接推荐。

一些有帮助的代码:

Ext.define('treePanel', {
    extend: 'Ext.tree.Panel',
    alias: 'widget.folderTreePanel',
    //title: 'Folder Tree',
    displayField: 'name',
    rootVisible: false,
    store: 'treeStore'
    dockedItems: {
        xtype: 'textfield',
        name: 'Search',
        allowBlank: true,
        enableKeys: true,
        listeners: {
            specialkey: function (txtField, e) { //This handler will essentially take the search value and return the path from the DB
                if (e.getKey() == e.ENTER){
                    var searchValue = txtField.getValue();
                    Ext.Ajax.request({
                        url: 'MyServlet',
                        params: {
                            caseType: 'search',
                            value: searchValue
                        },
                        success: function(response) {
                            response = Ext.decode(response.responseText);
                            var node, i=0;
                            expandFn = function () {
This is where I have a problem->node = this.up('treePanel').getStore().getNodeById(response.IDs[i].folderId);
                                node.expand();
                                i++;
                                if (i >= response.IDs.length-1) return;
                                expandFn();
                            }
                        }
                    });
                }
            }, scope: this
        }
    },
    columns: [{
        xtype: 'treecolumn',
        text: 'Folder Name',
        flex: 2,
        sortable: true,
        dataIndex: 'name'
    },{
        text: 'Folder ID',
        dataIndex: 'id',
        flex: 2,
        sortable: true
    }]
});

编辑:我找到了答案。每个事件将触发它的实例作为参数传递到处理函数中。在这种情况下,txtField 指的是文本字段本身。然后我可以遍历继承并找到面板。

但是现在有一个新问题。 expandFn() 被调用一次,然后因为“node”未定义而停止。它应该递归,直到响应数组中不再有任何项目。我再次认为这是一个范围问题,但我真的很困惑,而且我似乎没有看到出问题的地方......

最佳答案

listeners 配置有一个属性scope。您可以将其设置到树面板。

[编辑] 在specialkey监听器中,将this分配给一个变量。在 success 回调中,范围与specialkey 监听器中的范围不同。请参阅下面修改后的代码。

listeners: {
   scope: this,
   specialkey: function (txtField, e) { 
            var me = this;
            if (e.getKey() == e.ENTER){
                var searchValue = txtField.getValue();
                Ext.Ajax.request({
                    url: 'MyServlet',
                    params: {
                        caseType: 'search',
                        value: searchValue
                    },
                    success: function(response) {
                        response = Ext.decode(response.responseText);
                        var node, i=0;
                        expandFn = function () {
                            node = me.getStore().getNodeById(response.IDs[i].folderId);
                            node.expand();
                            i++;
                            if (i >= response.IDs.length-1) return;
                            expandFn();
                        }
                    }
                });
            }
}

关于javascript - ExtJS 4 中函数处理程序内的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23805184/

相关文章:

javascript - Rxjs 摆脱双重订阅

extjs - 重用部分配置有哪些好方法?

kotlin - 控制 Kotlin DSL 构建器中的范围

javascript - 不使用 Ext.getCmp 获取复选框值

Java,Mysql-列名标识为变量

javascript - 为什么简单的 JQuery 对话框/弹出窗口不起作用?

javascript - 如何防止 JS 缩小删除命名函数表达式的名称?

java - 使用 Rhino : pausing/resuming scripts 在 Java 中解释 JavaScript

ExtJS 与 ExtGWT - 它们在功能上是否相同?

javascript - 使用 `Ext.window.Window`类实例后如何释放内存?