2016-09-29 11 views
0

ExtJS 6.0.2:ノード順序を変更した後にツリーパネルを保存する

ツリーパネルのインデックス順の変更をサーバーに送信する必要があります。

これを読んだ後

Ext 4.2 Using proxy to save treeこのExtJs Store.save()?How to save JSON file when use it as ExtJs grid storeと、いくつかの混乱煎茶のドキュメント...

1)私は、私の店のプロキシでライターを設定する必要があります。結果:何もありません。

2)私のストアにautoSync:trueを設定する必要があります。結果:何もありません。

3)fieldsプロパティを設定する必要があります。結果:何もありません。

4)属性をfieldsプロパティに入れる必要があります。結果:私のサーバーは呼び出しを検出しましたが、要求パラメータリストには何も付属しませんでした。

5)writerrootProperty:'data'属性を入れる必要があります。結果:うわー!私のサーバーは、スワップする2つのノードを持つJSON文字列を検出しました。私が間違ってやっている2つのスワップのノードが起こることを開始する2つの親ノードと非常に奇妙なものに置き換えられました...

data = [{"index":5,"id":"6"},{"index":4,"id":"12"}] 

すべての良い、しかし私は、担保効果を気づきました?試した後

http://i.stack.imgur.com/xxfU4.png

ParkingContinentesを交換する:前

http://i.stack.imgur.com/EEs72.png

マイストア:

var layerStore = Ext.create('Ext.data.TreeStore', { 
    autoSync:true, 
    fields: [ 

       { name: 'index', type: 'int' }, 
       { name: 'text', type: 'string' }, 
       { name: 'serviceUrl', type: 'string' }, 
       { name: 'layerName', type: 'string' }, 
       { name: 'originalServiceUrl', type: 'string' } 
      ], 
    proxy: { 
     type: 'ajax', 
     url: 'getLayersTreeNode', 
     reader: { 
      type: 'json' 
     },   
     writer: { 
      type:'json', 
      allowSingle:false, 
      encode:true, 
      rootProperty:'data' 
     }   
    }, 

    root: { 
     text: 'Camadas', 
     id: 0, 
     index:0, 
     expanded: true 
    }, 
    listeners : { 
     write: function(store, operation, opts){ 
      alert("Fired!"); 
     } 
    } 

}); 

マイツリー:

var layerTree = Ext.create('Ext.tree.Panel', { 
    store: layerStore, 
    viewConfig: { 
     plugins: { 
      ptype: 'treeviewdragdrop', 
     } 
    }, 
    scrollable: true, 
    scroll: 'both', 
    height: 350, 
    width: 300, 
    flex:1, 
    useArrows: true, 
    dockedItems: [{ 
     xtype: 'toolbar', 
     items: [{ 
      text: 'Expandir', 
      handler : layerTreeExpandir 
     }, { 
      text: 'Recolher', 
      handler : layerTreeRecolher 
     }] 
    }], 
    listeners: { 
     itemclick: layerTreeItemClick, 
     checkchange: function(node, checked, eOpts){ 

      node.eachChild(function(n) { 
       node.cascadeBy(function(n){ 
        n.set('checked', checked); 
       }); 
      }); 


      //check parent node if child node is check 
      p = node.parentNode; 
      var pChildCheckedCount = 0; 
      p.suspendEvents(); 
      p.eachChild(function(c) { 
       if (c.get('checked')) pChildCheckedCount++; 
        p.parentNode.set('checked', !!pChildCheckedCount); 
        p.set('checked', !!pChildCheckedCount); 
       }); 
      p.resumeEvents(); 
     }  

    } 
}); 

A JSONツリーの応答:

[{"checked":false,"cls":"","id":"1","idNodeParent":27,"index":0,"layerName":"osm:highway-label","leaf":true,"originalServiceUrl":"","serviceUrl":"http://192.168.25.25:8080/geoserver/osm/wms","text":"Nomes das Vias"},{"checked":false,"cls":"","id":"2","idNodeParent":27,"index":1,"layerName":"osm:vias","leaf":true,"originalServiceUrl":"","serviceUrl":"http://192.168.25.25:8080/geoserver/osm/wms","text":"Vias"},{"checked":false,"cls":"","id":"3","idNodeParent":27,"index":2,"layerName":"osm:placenames-medium","leaf":true,"originalServiceUrl":"","serviceUrl":"http://192.168.25.25:8080/geoserver/osm/wms","text":"Nomes de Localidades"},{"checked":false,"cls":"","id":"4","idNodeParent":27,"index":3,"layerName":"osm:parking-area","leaf":true,"originalServiceUrl":"","serviceUrl":"http://192.168.25.25:8080/geoserver/osm/wms","text":"Parking"},{"checked":false,"cls":"","id":"5","idNodeParent":27,"index":4,"layerName":"land","leaf":true,"originalServiceUrl":"","serviceUrl":"http://192.168.25.25:8080/geoserver/osm/wms","text":"Continentes"},{"checked":false,"cls":"","id":"24","idNodeParent":27,"index":5,"layerName":"osm:powergenerator","leaf":true,"originalServiceUrl":"","serviceUrl":"http://192.168.25.25:8080/geoserver/osm/wms?","text":"Geradores"}] 
+0

名前の変更は、私がルートJSONノードを送り返していることが分かりました。私は、すべての要求に応答しなければならないことを知らなかった。ここから少し助けてください:https://www.sencha.com/forum/showthread.php?107217-JSON-Response-Format-for-HTTPProxy-on-create-update –

+0

今私はその種類を知る方法を発見する必要があります適切な応答を返すためにクライアントが行っている操作。 –

答えて

0
ここにいくつかの研究の後

を追加しましたグローバルVAR:ope

に追加http://alvinalexander.com/source-code/software-dev/sencha-store-ajax-json-proxy-readerwriter-example、ここhow to get Extjs 4 store's request data on beforeload event?は私が私の店を変更しました代理人:extraParams : { 'operation': ope }

は、リスナーを追加しました:

listeners : { 
    write: function(store, operation, opts){ 
     ope = operation.action; 
     alert(ope); 
    } 
} 

私は操作がupdateであるが、そのヌル(空)ため、サーバー側で送信ope varが前に行動値を取っていないようで見ることができます。

方法を見つけるには:urlを削除し、プロキシにapiを追加しました:各々の操作に対して

api: { 
     read: 'getLayersTreeNode', 
     create: 'createLayersTreeNode', 
     update: 'updateLayersTreeNode', 
     destroy: 'destroyLayersTreeNode' 
    } 

私は、サーバー側で処理するために、異なる作用を有します。ツリーを混乱させるのを避けるために空のJSONを送り返します。

関連する問題