Extjs 4.X使用按钮向上/向下移动网格记录

dfuffjeb  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(132)

这篇文章是我之前的文章(here)的延续,我还没有找到一个可行的解决方案。简而言之:我创建了一个Extjs(4.X)网格,其中包含父母和孩子的记录。记录是按排序顺序排列的,其中子级中的记录总是出现在其父级的正下方,如图所示,其中“P”指定一个记录为父级,而“C”指定一条记录为子级。
“May”是Peter的父母,Odin是Thor和Loki的父母,Bruce没有孩子被标记为parent(独立实体)

小提琴:https://fiddle.sencha.com/#view/editor&fiddle/3jks
当我上下移动组时,我希望改变父母的排序顺序,同时也带着他们的孩子。起初我想尝试拖放,但我找不到一个可行的解决方案(我尝试了Gird DragAndDrop和TreeGrid,提琴在我以前的post上)。
根据前一篇公开帖子上的建议,我尝试了分组父组和子组,但我无法拖放整个组。为了利用我所掌握的知识,我创建了按钮,用于根据用户单击向上或向下移动组。分组是基于排名列的,所以只要我更新排名,记录就应该理想地跳转分组。由于某种原因,当我单击Rank:2组上的“UP”按钮时,BRUCE更改为Rank:1,May Parker更改为Rank:2,这是正确的,但Peter Parker仍保持在Rank:1.调试代码后,我发现商店出于某种原因删除了Peter的记录,并将其替换为May Parke的另一个副本(但网格没有显示它)。我把控制台消息放在我们可以观察到的地方。这里可能有什么问题?非常感谢您的指点和建议。如果有更好的方法根据等级移动这些记录,我也愿意改变整个逻辑。

6g8kf2rb

6g8kf2rb1#

这里是网格石斑鱼头部拖放的工作提琴。
以下是构建up-down按钮示例的详细信息和一些帮助:
您正在多次更新记录。
我建议您通过recordId设置排名,以确保每个项目只处理一次。否则,在处理切换组时会记录它们。

// I am using onBeforeGroupClick to handle collapsing correctly
    onBeforeGridGroupClick: function (grid, node, dataIndex, e, eOpts) {
        const targetIsButton = e.getTarget().type === 'button';

        console.log('[onBeforeGridGroupClick] targetIsButton', targetIsButton);

        if (targetIsButton) {
            this.updateRank(grid, node, dataIndex, e)
        }

        // return false will stop gridgroupclick from running
        return !targetIsButton;
    },

    // here I am updating the rank
    updateRank: function (grid, node, group, e) {
        console.log('[updateRank] dataIndex', group);

        const store = grid.getStore();

        // collect the group data for the clicked group
        const groups = store.getGroups(),
            currentGroupIndex = groups.findIndex('rank', group),
            currentGroup = groups.items[currentGroupIndex],
            // Ext.pluck gets the IDs from the current group
            currentRecordIds = Ext.pluck(currentGroup.items, 'id');

        // collecting the group data for the group you want to switch with
        const isUp = e.getTarget().value === 'Up';
            targetId = currentGroupIndex + (isUp ? 1 : -1)
            targetGroupIndex = groups.findIndex('rank', targetId),
            targetGroup = groups.items[targetGroupIndex],
            targetRecordIds = Ext.pluck(targetGroup.items, 'id');

        // define out of range conditions
        if(targetGroupIndex < 0) return;

        // stop the grid from updating while you work on the store
        store.suspendEvents(true);

        // set the rank for the target and current records
        Ext.Array.each(targetRecordIds, function(id) {
            const record = store.findRecord('id', id);

            record.set('rank', currentGroupIndex);
        })
        Ext.Array.each(currentRecordIds, function(id) {
            const record = store.findRecord('id', id);

            record.set('rank', targetGroupIndex);
        })

        // update the grid from all suspended store events
        store.resumeEvents();
    }

相关问题