Extjs4 ExtJS 4:动态地将子树节点添加到非根节点?
我正在尝试在选择非根节点时将子树节点动态添加到该节点 我就是这样实现的: 首先,我用TreeStore填充树,然后为了动态添加子树节点,我在树控制器中的itemexpand事件中处理它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
//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异步工作。因此,添加过程是:
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);