0

我正在处理树中的移动节点,当它们移动时,它们的 ID 通过后端的 C# 在数据库中更新。到目前为止,我已经设法更新了正在移动的节点的位置,但是在它移动之后,树中其他节点的位置也应该得到更新。谁能告诉我如何进行此操作?

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.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 回答
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(),这仅涉及一条记录。通过将子节点设置为脏节点,同步会向服务器的更新调用发送多个记录(在我的情况下,我使用的是自动同步和直接)。

您应该考虑当用户将节点从父节点移动到父节点的兄弟节点时会发生什么 - 旧父节点和新父节点中某些节点的索引(排序)都会发生变化。因此,您最终可能会在服务器上获得 6 条需要更新的记录。

我要说的是,鉴于 4.1 已经正确处理节点移动,您最好升级到 4.1 并利用对它的本机支持,而不是自己编写代码。如果您坚持使用 4.0.7,请记住要考虑移动节点可能需要更新许多节点。

于 2012-06-15T10:56:06.427 回答