ExtJS TreeStore更新事件fire而不是create

时间:2011-12-28 08:17:03

标签: extjs4

当我调用

时,我正在使用tree.Panel和TreeStore
sel_node.parentNode.appendChild(node);
tree.getSampleStore().sync();

ExtJS fire事件称为样本存储代理:更新url而不是create url我可能做错了什么?

4 个答案:

答案 0 :(得分:3)

您使用的是什么版本的ExtJS4?

在我的情况下,使用ext-4.0.7-gpl,我调试了一下appendChild方法从对象创建节点然后执行一些有关节点在树中的位置的更新操作,比如设置下一个兄弟,父母等,见[1]。

同步时,商店使用getUpdatedRecordsgetNewRecords [2]方法来确定要运行的操作。更新或创建。不知何故,我们的附加儿童最终被更新,而不是创建。

请注意,该方法不会检查父节点的子节点是否已加载,只是将新节点推送到空的childNodes数组中;在所有这些操作结束后,父节点的其他子节点永远不会显示在树中;如果更新操作导致服务器端生成新的id,则代码在行original = me.tree.getNodeById(record.getId());上中断 - 在客户端没有生成旧id的节点。

简单地说,我认为这是一个错误。

[1] http://docs.sencha.com/ext-js/4-0/source/NodeInterface.html#Ext-data-NodeInterface-method-appendChild [2] http://docs.sencha.com/ext-js/4-0/source/AbstractStore.html#Ext-data-AbstractStore-method-getUpdatedRecords

添加:ExtJS 4.1 beta 2对我来说效果不佳

使用临时解决方案进行更新:我有点破解并认为我通过覆盖appendChild的{​​{1}}方法解决了这个问题,就像设置{{1}一样}属性,以便创建记录,而不是更新)。

请注意: 1)您应该在NodeInterface phantom方法回调中加入appendChild来电,否则推送到空NodeInterface的错误将会保留:新节点将出现在某处错误的地方; 2)我不得不覆盖expand的{​​{1}},尽量不要这样做,也许你会发现原因; 3)当商店下次同步时尝试删除我们新创建的节点时存在一些问题 - 无法追踪它; 0)我不是ExtJS甚至是JS大师,所以随意纠正这个黑客)

childNodes

这是我的代码,用于从表单updateIndexes中获取的值添加节点。单击树形网格的AbstractView中的图标即可打开表单:

Ext.data.NodeInterface.oldGpv = Ext.data.NodeInterface.getPrototypeBody;
Ext.data.NodeInterface.getPrototypeBody = function(){
    var ret = Ext.data.NodeInterface.oldGpv.apply(this, arguments);

    ret.appendChild = function(node, suppressEvents, suppressNodeUpdate) {
        var me = this,
        i, ln,
        index,
        oldParent,
        ps;


        if (Ext.isArray(node)) {
            for (i = 0, ln = node.length; i < ln; i++) {
                me.appendChild(node[i]);
            }
        } else {
            node = me.createNode(node);

            if (suppressEvents !== true && me.fireEvent("beforeappend", me, node) === false) {
                return false;
            }

            index = me.childNodes.length;
            oldParent = node.parentNode;

            if (oldParent) {
                if (suppressEvents !== true && node.fireEvent("beforemove", node, oldParent, me, index) === false) {
                    return false;
                }
                oldParent.removeChild(node, null, false, true);
            }else{
                node.phantom = true;
            }

            if(me.isLoaded()){
                index = me.childNodes.length;
                if (index === 0) {
                    me.setFirstChild(node);
                }

                me.childNodes.push(node);
                node.parentNode = me;
                node.nextSibling = null;

                me.setLastChild(node);

                ps = me.childNodes[index - 1];
                if (ps) {
                    node.previousSibling = ps;
                    ps.nextSibling = node;
                    ps.updateInfo(suppressNodeUpdate);
                } else {
                    node.previousSibling = null;
                }
                node.updateInfo(suppressNodeUpdate);
            }

            //console.log('appendChild was called');

            // I don't know what this code mean even given the comment
            // in ExtJS native source, commented out

            // As soon as we append a child to this node, we are loaded
            //if (!me.isLoaded()) {
            //    me.set('loaded', true);
            //}

            // If this node didnt have any childnodes before, update myself
            //else 
            //if (me.childNodes.length === 1) {
            //    me.set('loaded', me.isLoaded());
            //}

            if (suppressEvents !== true) {
                me.fireEvent("append", me, node, index);

                if (oldParent) {
                    node.fireEvent("move", node, oldParent, me, index);
                }
            }

            return node;
        }
    };
    return ret;
};

domainForm覆盖:

actioncolumn

答案 1 :(得分:1)

有同样的问题,对ext-4.1.0-beta-2的更新修复了它。

答案 2 :(得分:0)

原因可能是来自服务器的数据格式错误,以响应您的请求。 同步化不会发生。在服务器响应中传递值为TRUE的“success”键。

答案 3 :(得分:0)

嗯......试试这个......

beforeitemexpand(node, eOpts){ if (node.data.expanded) return false }