ExtJS TreeStore appendChild-ID存在问题
我正在尝试使用以下代码动态添加新节点:ExtJS TreeStore appendChild-ID存在问题,extjs,extjs4,extjs4.1,Extjs,Extjs4,Extjs4.1,我正在尝试使用以下代码动态添加新节点: var root = this.treeStore.getRootNode(); var n = { id:--this.counter, leaf: (type=='group') ? false : true, expanded:true, cls:'redtext',
var root = this.treeStore.getRootNode();
var n = {
id:--this.counter,
leaf: (type=='group') ? false : true,
expanded:true,
cls:'redtext',
text: (name == undefined) ? 'Nowa warstwa': name,
gsip:{
isGroup: (type=='group') ? true : false,
layer:{}
}
};
root.appendChild(n);
上面的代码将新节点添加到根节点,但奇怪的是,新创建的节点包含根节点的所有子节点。因此树崩溃,因为有相同id的节点。当我删除id:-this.counter时,一切正常。我需要这个id,我提供的是唯一的。新创建的节点的internalId不同于id,所有其他现有节点的internalId=data.id
以下为门店和型号代码:
Ext.define('GSIP_PORTAL.model.Layer',{
extend: 'Ext.data.Model',
fields: [
{name: 'id', type: 'int'} , 'text', 'leaf', 'gsip'],
idProperty:'id'
});
Ext.define('GSIP_PORTAL.store.Layers', {
extend: 'Ext.data.TreeStore',
model:'GSIP_PORTAL.model.Layer',
proxy: {
type: 'ajax',
url: dispatcher.getUrl('getProfile'),
reader: {
type: 'json',
root: 'layers'
}
},
defaultRootId:0,
root:{
expanded:true
}
});
下面是用于构建树的json响应。我使用这个json立即构建树,这就是为什么我将属性层作为根
{
"id":10003,
"name":"GSIP",
"defaultProfile":false,
"layers":[
{
"id":10012,
"expanded":true,
"text":"GSIP",
"leaf":false,
"layers":[
{
"id":10013,
"expanded":true,
"text":"Dzialki",
"leaf":true,
"layers":[
],
"gsip":{
"displayName":"Dzialki",
"internalName":"test",
"isGroup":false,
"layer":{
"id":1006,
"type":{
"id":1002,
"name":"WMS (queryable)",
"description":"WMS z zapytaniami GetFeatureInfo."
},
"url":"http://192.168.21.10:8080/geoserver/gsip/wms",
"layerName":"egb_dzialki"
},
"order":0
}
}
],
"gsip":{
"displayName":"GSIP",
"internalName":"test",
"isGroup":true,
"order":0
}
}
],
"tools":[
]
}
添加新节点TypeError后,我出现以下ext all调试错误:第行中未定义记录[I]:
ns[i].viewRecordId=records[i].internalId 我认为您应该解决一些问题,因为您的json非常疯狂 节点记录是用包装的,所以不需要在模型中声明像leaf这样的字段。 模型记录字段只能由基本类型int、bool、string等组成。。ExtJS不知道如何处理对象字段——这需要关联。您声明了一个名为gsip的字段,但返回的json是一个对象。 什么是“工具”? 我建议您清理json,只包含层次结构层。从那里开始 此外,据我所知,这不是向树中添加子节点的正确方法。这是:
var root = this.treeStore.getRootNode();
var n = root.createNode({
id:--this.counter,
leaf: (type=='group') ? false : true,
expanded:true,
cls:'redtext',
text: (name == undefined) ? 'Nowa warstwa': name,
gsip:{
isGroup: (type=='group') ? true : false,
layer:{}
}
});
root.appendChild(n);
然后,ExtJs在内部使用internalId处理尚未添加到服务器端的任何记录-ExtJs需要自己的内部id,因为客户端id可能不是由客户端设置的,而是保存到数据库后从服务器返回的id。因此,一旦记录从服务器返回,Ext就会将internalId设置为与id字段相同;但在客户端中创建的记录不会发生这种情况。请重写更新索引功能,它将正常工作。您是否100%确定-this.counter是唯一的,即使与从服务器返回的ID(如root)相比较也是如此?是的,我确定。即使我手动添加id,比如-666,同样的错误,同样的错误。我想我的根节点搞乱了。我用用于构建treeAd1的json响应更新了帖子。那个么树怎么知道它是不是叶子呢?文本字段呢?它也在NodeInterface中,但如果我没有在model中指定它,节点文本将为空Ad2。我不想让它被处理。我只是想让它在那里。我一直在用网格和其他组件来做这件事,效果很好。公元3年。工具还没有实现。我没有在模型中声明它们,所以工具不是记录的一部分。我使用id与其他组件通信。我发现非常糟糕的解决方法:而不是var node=this.treeStore.getNodeByIddata.id;我使用var node=this.treeStore.getRootNode.findChild'internalId',data.internalId,true;。创建节点后,我只需要创建node.data['internalId']=node.internalId;。一切正常,但我真的不喜欢。等我有时间再谈这个问题。谢谢伊扎基的帮助。