【问题标题】:ExtJS TreeStore appendChild - problems with idsExtJS TreeStore appendChild - ids 问题
【发布时间】:2015-11-27 16:01:43
【问题描述】:

我正在尝试使用以下代码动态添加新节点:

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,而我提供的 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: records[i] is undefined 后出现以下 ext-all-debug 错误: ns[i].viewRecordId = records[i].internalId;

【问题讨论】:

  • 您是否 100% 确定 --this.counter 是唯一的,即使与从服务器返回的 ID(如 root 的 ID)相比也是如此?
  • 是的,我确定。即使我手动添加 -666 之类的 id,同样的错误。

标签: extjs extjs4 extjs4.1


【解决方案1】:

我认为你应该修复一些问题,因为你的 json 非常疯狂。

  • 节点记录使用NodeInterface 包装,因此无需在模型中声明leaf 之类的字段。
  • 模型记录字段只能由原始类型(int、bool、string 等)组成。 ExtJS 不知道如何处理对象字段——你需要关联。您声明了一个名为 gsip 的字段,但返回的 json 是一个对象。
  • 什么是“工具”?

我建议您清理 json 以仅包含 layers 层次结构。然后从那里拿走。

此外,据我所知,这不是将子节点添加到树的正确方法。这是:

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);

然后,internalId 由 ExtJs 内部用于尚未添加到服务器端的任何记录 - ExtJs 需要自己的内部 id,因为客户端 id 可能不是由客户端设置而是返回的从服务器保存到数据库后。因此,一旦有记录从服务器返回,Ext 就会将 internalId 设置为与 id 字段相同;但在客户端创建的记录不会发生这种情况。

【讨论】:

  • 同样的错误。我认为我的根节点搞砸了。我用用于构建树的 json 响应更新了帖子
  • 广告1。那么树怎么知道它是不是叶子呢?文本字段呢?它也在 NodeInterface 中,但如果我没有在模型中指定它,节点文本将为空 Ad2。我不希望它被处理。我只是希望它在那里。我一直用网格和其他组件来做这件事,它工作正常。广告 3. 工具尚未实施。我没有在模型中声明它们,所以工具不是记录的一部分。
  • 我使用了 id 与其他组件进行通信。我发现非常糟糕的解决方法:我使用var node = this.treeStore.getRootNode().findChild('internalId', data.internalId, true); 而不是var node = this.treeStore.getNodeById(data.id);。创建节点后,我只需要node.data['internalId'] = node.internalId;。一切正常,但我真的不喜欢它。当我找到一些时间时,我会回到这个问题上。感谢 Izhaki 的帮助。
【解决方案2】:

请覆盖您的更新索引功能,它将正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多