Extjs4 ExtJS TreeStore更新事件fire而不是create

Extjs4 ExtJS TreeStore更新事件fire而不是create,extjs4,Extjs4,当我呼叫时,我正在使用tree.Panel和TreeStore sel_node.parentNode.appendChild(node); tree.getSampleStore().sync(); 名为示例存储代理的ExtJS fire事件:更新url而不是创建url我可能做错了什么?您使用的ExtJS4的确切版本是什么 在我的情况下,使用ext-4.0.7-gpl,我调试了一点,发现appendChild方法从和对象创建一个节点,然后执行一些关于节点在树中位置的更新操作,如设置下一个同级

当我呼叫时,我正在使用tree.Panel和TreeStore

sel_node.parentNode.appendChild(node);
tree.getSampleStore().sync();

名为示例存储代理的ExtJS fire事件:更新url而不是创建url我可能做错了什么?

您使用的ExtJS4的确切版本是什么

在我的情况下,使用ext-4.0.7-gpl,我调试了一点,发现
appendChild
方法从和对象创建一个节点,然后执行一些关于节点在树中位置的更新操作,如设置下一个同级、父级等,请参见[1]

同步时,存储使用
getUpdateRecords
getNewRecords
[2]方法来确定要运行的操作。更新或创建。不知何故,我们附加的子项结果是更新的,而不是创建的

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

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

[1] [2]

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

使用临时解决方案更新:我进行了一些黑客攻击,并认为我通过覆盖
节点接口
appendChild
方法解决了问题,如下所示(只需设置
幻影
属性,以便创建记录,而不是更新记录)

请注意: 1) 您应该在
NodeInterface
expand
方法回调中包含
appendChild
调用,否则推到空
childNodes
的错误将继续存在:新节点将出现在错误的位置; 2) 我不得不重写
抽象视图的
更新索引
,尽量不要这样做,也许你会发现原因; 3) 当商店下次同步时试图删除我们新创建的节点时,会出现一些问题-无法跟踪它; 0)我不可能是ExtJS,甚至不是JS大师,所以请随时纠正这个问题)

updateIndexes
重写器:

Ext.override(Ext.view.AbstractView, {
    updateIndexes : function(startIndex, endIndex) {
        var ns = this.all.elements,
            records = this.store.getRange(),
            i;

        startIndex = startIndex || 0;
        endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length < records.length?(ns.length - 1):records.length-1) );
        for(i = startIndex; i <= endIndex; i++){
            ns[i].viewIndex = i;
            ns[i].viewRecordId = records[i].internalId;
            if (!ns[i].boundView) {
                ns[i].boundView = this.id;
            }
        }
    }    
});
Ext.override(Ext.view.AbstractView{
更新索引:函数(startIndex、endIndex){
var ns=this.all.elements,
records=this.store.getRange(),
我
startIndex=startIndex | | 0;
endIndex=endIndex | |((endIndex==0)?0:(ns.length对于(i=startIndex;i有相同的问题,ext-4.1.0-beta-2的更新修复了它。

原因可能是响应您的请求而从服务器发送的数据格式错误。 同步没有发生。请在服务器响应中传递值为TRUE的“success”键。

Hmm…试试这个

beforeitemexpand(节点,eOpts){
if(node.data.expanded)返回false
}

var node = grid.store.getAt(rowIndex);
node.expand(false, function(){
    var newDomain = domainForm.getValues();
    newDomain.parent = {id: node.raw.id}; // i don't know whether you'll need this
    var newNode = node.appendChild(newDomain);
    me.store.sync();
});
Ext.override(Ext.view.AbstractView, {
    updateIndexes : function(startIndex, endIndex) {
        var ns = this.all.elements,
            records = this.store.getRange(),
            i;

        startIndex = startIndex || 0;
        endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length < records.length?(ns.length - 1):records.length-1) );
        for(i = startIndex; i <= endIndex; i++){
            ns[i].viewIndex = i;
            ns[i].viewRecordId = records[i].internalId;
            if (!ns[i].boundView) {
                ns[i].boundView = this.id;
            }
        }
    }    
});