0

ツリー内のノードの移動に取り組んでおり、ノードが移動されると、バックエンドのC#を介してデータベース内のIDが更新されます。これまで、移動中のノードの位置を更新することができましたが、移動後、ツリー内の他のノードの位置も更新されるはずです。誰かがこれを進める方法を教えてもらえますか?

itemmove : {
fn : function(v, oldParent, newParent, index, eOpts) {
var nodeID = v.data.id;
var oldParent = oldParent.data.id;
var newParent = newParent.data.id;
var index = index;
var level = v.data.level;
movenode(nodeID, oldParent, newParent, index, level);
}
}


function movenode(nodeID, oldParent, newParent, index, level) {
Ext.Ajax.request({
    url : 'data/pages.aspx',
    params : {
        UserID : USER.UserID,
        mode : 'MOVENODE',
        currentNode : nodeID,
        oldParentNode : oldParent,
        newParentNode : newParent,
        index : index,
        level : level,
        ProjDB : projDB
    },
    success : function() {
        loadTREEst();
        genMessage(LANG.Suc, LANG.SaveOK, 'tick', false);

    },
    failure : function() {
        genMessage(LANG.Warn, LANG.GenWarn, 'warn', false);
    }
});
}

そこで、パラメータをSQlに送信してから、移動したノードのインデックスを更新します。

たとえば、ノードを位置8から1に移動すると、データベース内で8番目のノードのインデックスは1に変更されますが、最初のノードのインデックスは1のままです。このため、ツリーも更新されません。ツリー内の他のすべてのノードも更新する必要があります。したがって、この場合、インデックス1のノードはインデックス2になり、インデックス2のノードはインデックス3になります。誰かが私にこれを行う方法を説明できますか?

これを行うための自動同期または同期以外の方法はありますか?前もって感謝します。

4

2 に答える 2

1

これは私が4.0.7のために持っていたコードです、私の記憶にそれはこの問題を解決しました。

// This happens after drag and drop
onItemMove: function(aNode, aOldParent, aNewParent, aIndex, aOptions)
{

    // Update the indeces of all the parent children (not just the one that moved)
    for ( i = 0; i < aNewParent.childNodes.length; i++ )
    {
        aNewParent.childNodes[i].data.sort = i;
        aNewParent.childNodes[i].setDirty();
    }

    this.mStore.sync();
},

サーバーに独自のリクエストを送信しているため、mStore.sync()がないことに注意してください。これには、1つのレコードしか含まれていません。子ノードをダーティとして設定することにより、syncはサーバーの更新呼び出しに複数のレコードを送信します(私の場合、autosyncとdirectを使用しています)。

ユーザーがノードを親ノードから親の兄弟に移動するとどうなるかを考慮する必要があります。古い親と新しい親の両方の一部のノードのインデックス(並べ替え)が変更されます。したがって、サーバー上で更新が必要な6つのレコードが作成される可能性があります。

私が言っているのは、4.1がすでにノードの移動を正しく処理していることを考えると、4.1にアップグレードして、自分でコーディングするよりも、これに対するネイティブサポートを利用する方がよい場合があります。4.0.7に固執する場合は、ノードの移動には多くのノードの更新が必要になる可能性があることを忘れないでください。

于 2012-06-15T10:56:06.427 に答える
1

4.1で動作するサンプルコードを次に示します。

Ext.define('BS.model.ItemCategory', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'name'     , type: 'string'},
        {name: 'iconCls'  , type: 'string', defaultValue: 'treenode-no-icon'},
        {name: 'leaf'     , type: 'boolean', defaultValue: false},
        {name: 'expanded' , type: 'boolean', defaultValue: true, persist: false},
        {name: 'index'     , type: 'int'},        
    ],

    proxy: {
        type: 'direct',

        api: {
            create: ItemCategories.Create,
            read: ItemCategories.Read,
            update: ItemCategories.Update,
            destroy: ItemCategories.Delete,
        },
    }, 
});

サーバーはphpではないため、直接プロキシを使用することはありませんが、対応するサーバースクリプトを配置するだけです(ドキュメントを参照)。

それから私の店:

Ext.define('BS.store.ItemCategories', {

    extend: 'Ext.data.TreeStore',    
    model: 'BS.model.ItemCategory',

    autoSync: true,

    root: {
        text: 'Root',
        id: 'NULL',
        expanded: true
    },

    clearOnLoad: true,
});

そしてビュー:

Ext.define('BS.view.admin.pages.item-categories.ItemCategories' ,
{
    extend: 'Ext.tree.Panel',
    alias : 'widget.item-categories-tree',

    store: 'ItemCategories',

    displayField: 'name',

    rootVisible: false,
    useArrows: true,
    multiSelect: false,
    singleExpand: false,    
    allowDeselect: true,

    plugins: {
        ptype: 'treeviewdragdrop',                    
    },          
});

それはほとんどそれです!ノードを移動すると、ExtJSが、インデックス(並べ替え)が変更されたすべてのノードの配列を含む更新要求をサーバーに送信することがわかります。

于 2012-06-15T11:10:56.590 に答える