0

次のコードを使用して新しいノードを動的に追加しようとしています:

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 は一意です。新しく作成されたノードには、id とは異なる internalId があり、他のすべての既存のノードには 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

4

2 に答える 2

1

あなたのjsonはかなりワイルドなので、修正すべきだと思うことがいくつかあります。

  • ノード レコードはNodeInterfaceleafでラップされるため、モデルのようにフィールドを宣言する必要はありません。
  • モデル レコード フィールドは、プリミティブ型 (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サーバー側にまだ追加されていないレコードに対して、ExtJ によって内部的に使用されます。クライアント ID はクライアントによって設定されず、保存後にサーバーから返される可能性があるため、ExtJ には独自の内部 ID が必要です。データベース。そのため、レコードがサーバーから返されるとすぐに、Ext は internalId を id フィールドと同じに設定します。ただし、クライアントで作成されたレコードでは発生しません。

于 2013-01-17T12:35:58.153 に答える
-2

インデックスの更新機能をオーバーライドしてください。正常に機能します。

于 2015-11-27T06:18:54.037 に答える