Extjs4 ExtJS 4:动态地将子树节点添加到非根节点?

Extjs4 ExtJS 4:动态地将子树节点添加到非根节点?,extjs4,Extjs4,我正在尝试在选择非根节点时将子树节点动态添加到该节点 我就是这样实现的: 首先,我用TreeStore填充树,然后为了动态添加子树节点,我在树控制器中的itemexpand事件中处理它 //pThis is a NodeInterface obj of the selected node itemexpand: function (pThis, pEOpts) { //type is an attribute that I added so that I know what type

我正在尝试在选择非根节点时将子树节点动态添加到该节点

我就是这样实现的:

首先,我用TreeStore填充树,然后为了动态添加子树节点,我在树控制器中的itemexpand事件中处理它

//pThis is a NodeInterface obj of the selected node
itemexpand: function (pThis, pEOpts) {
      //type is an attribute that I added so that I know what type of node that got selected
      if (pThis.raw.type === 'Staff' && !pThis.hasChildNodes()) {
                    var staffNodeAry = [{text:"Teachers", type:"ChildStaff", leaf: false},
                                                     {text:"Principals", type:"ChildStaff", leaf: false}];          
                     pThis.appendChild(staffNodeAry); 
       }
}
这非常有效,因为我可以看到“员工”类型下的“教师”和“校长”节点,但到目前为止,我发现了两个问题:

1) 控制台上出现以下错误:

未捕获的TypeError:无法读取未定义的属性“internalId”

我不知道为什么,但如果有人能启发我,那就太好了

2) 当我展开“教师”和“校长”时,itemexpand返回的NodeInterface obj有一个未定义的原始对象

所以我不能这么做:pThis.raw.type

根据我的理解,我不需要创建新的TreeStore来添加任何新的子节点,我认为通过创建一个遵循NodeInterface的对象数组就足够了,但我可能错了。 如果有人能给我指出正确的方向,那就太好了

汉迪

更多信息:

我所做的实际上是遵循ExtJS4文档,所以我相信这是ExtJS4框架上的一个bug


我还用Extjs-4.1.0-rc3测试了这一点,它也产生了相同的错误。

我认为这是因为Ext.TreePanel异步工作。因此,添加过程是:

  • 附加子元素,将虚拟子元素叶子添加到树中,在树的角上有红色标记
  • 调用存储的createapi
  • 接收响应,如果它成功=true,则使用虚拟
  • 更改的目标是设置internakId属性,因此只有在发生此更改后才能添加新的子级。我认为更好的方法是编写一些递归函数,并将其绑定到存储区添加的事件

     tree.getStore().on('update', addChild);
    


    我已解决此问题,将事件项扩展更改为事件后项扩展。我没有证明这一点的文件。调试器告诉我,如果手动添加节点,视图将侦听itemexpand事件并执行一些出错的操作

    对于问题2:您没有原始对象,因为它是在加载操作之后由存储的读取器创建的。因此,如果手动添加节点,则原始对象不存在


    .appendChild()函数的文档说明:

    node : Ext.data.NodeInterface/Ext.data.NodeInterface[]
    The node or Array of nodes to append
    
    您试图附加一个包含2个对象的数组,但它们不是“NodeInterface”实例。因此,您应该正确地创建它们,如下所示:

    var nodeToAppend1 = pThis.createNode({text:"Teachers", type:"ChildStaff", leaf: false});
    pThis.appendChild(nodeToAppend1);
    

    我记得一年前也犯过同样的错误,所以我希望这能有所帮助。

    谢谢Rustem。该死,我必须走那条路才能添加子节点?我刚刚发现itemclick事件返回具有NodeInterface属性的记录。当我在记录中添加了child时,我就不再有internalId问题了。我仍然有未定义的原始对象的问题,但我现在可以接受。
    var nodeToAppend1 = pThis.createNode({text:"Teachers", type:"ChildStaff", leaf: false});
    pThis.appendChild(nodeToAppend1);