首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在将项目拖到另一个文件夹后更新SmartGWT TreeGrid中的节点?

如何在将项目拖到另一个文件夹后更新SmartGWT TreeGrid中的节点?
EN

Stack Overflow用户
提问于 2013-08-21 10:50:44
回答 1查看 1.1K关注 0票数 0

我实现了一个TreeGrid,它绑定到SmartGWT中的一个RestDataSource。为了提供一个数字,我有一个名为TreeGridField的requirementListing,它是在客户端计算的。每次更新后,我运行一个函数,该函数(Re)计算数字。

数字看起来是这样的。

代码语言:javascript
运行
复制
1. Item 1 in level 0
|_ 1.1 item 1 in level 1
     |_ 1.1.1 item 1 in level 2
2. Item 2 in level 0

为了在更新节点之后触发计算函数,我使用了以下几个处理程序

  • DataArrivedHandler
  • EditCompleteHandler
  • RemoveRecordClickHandler

所有这些都正常工作,唯一不更新的情况是,如果我将一项移动到另一个文件夹(或文件夹中)。我试图从DropCompleteHandlerFolderDropHandler调用算术函数,它们似乎都不起作用。在阅读Tree - drag&drop nodes - refresh?之后,我使用的是DeferredComand,它在Chrome中工作,但在Firefox中不起作用。使用最新版本的SmartGWT,它也不能在Chrome上工作。

代码语言:javascript
运行
复制
requirementTreeGrid.addDropCompleteHandler(new DropCompleteHandler() {

        @SuppressWarnings("deprecation")
        @Override
        public void onDropComplete(DropCompleteEvent event) {
            SC.logInfo("Drop complete");
            DeferredCommand.addCommand(new Command() {
                public void execute() {
                  treeNumerator.addTreeNumeration(requirementTreeGrid);
                    requirementTreeGrid.refreshFields();
                    requirementTreeGrid.redraw();
                    SC.logInfo("tree updated");
                }
            });
        }
    });
requirementTreeGrid.addFolderDropHandler(new FolderDropHandler() {
                   //same code like above
            });
        }
    });

由于不推荐DeferredCommand,所以我也尝试过使用Scheduler.scheduleDeferred(),但遗憾的是,这也没有成功。

我的计算功能:

代码语言:javascript
运行
复制
public void addTreeNumeration(TreeGrid treeGrid) {
    this.levels = new Integer[numberOfLevels];
    for (int i=0; i<=numberOfLevels-1;i++){ //fill array with 1
        levels[i] = 1;
    }

    TreeNode rootNode = treeGrid.getTree().getRoot(); // root element of tree
    int levelIndex = 0;

    calculateRequirementTreeNumeration(treeGrid, treeGrid.getTree()
            .getChildren(rootNode), levelIndex, levels);
}

private void calculateRequirementTreeNumeration(TreeGrid treeGrid,
        TreeNode[] lvlNodes, int levelIndex, Integer[] levels) {
    levels[levelIndex]=1;
    for (TreeNode lvlNode : lvlNodes) {
        String numerationLabel = "";
        for (int i = 0; i <= levelIndex; i++) {
            numerationLabel = numerationLabel + levels[i] + ".";
        }
        SC.logInfo("->Req " + numerationLabel);
        lvlNode.setAttribute("requirementListing", numerationLabel);
        // weitere ebene?
        if (treeGrid.getTree().hasChildren(lvlNode)) {
            SC.logInfo(numerationLabel + " -> new level");
            if (levelIndex + 1 < numberOfLevels) { // nur "numberOfLevels" ebenen werden berechnet.
                calculateRequirementTreeNumeration(treeGrid, treeGrid
                        .getTree().getChildren(lvlNode), levelIndex + 1,
                        levels);
            } else {
                deleteRequirementTreeNumeration(treeGrid, treeGrid
                        .getTree().getChildren(lvlNode), levelIndex + 1);
            }
        }
        levels[levelIndex]++;
    }
}

我还调试了的问题,在我看来,问题是这个数字是在删除之后,但在RestDataSource发送响应之前完成的。看起来我刚移动的节点已经消失,直到DS发送一个响应。(因此requirementListing字段没有更新)

JavaScriptDebug:

代码语言:javascript
运行
复制
12:35:35.724:MUP5:INFO:Log:Drop complete
12:35:35.736:INFO:Log:->Req 1.
12:35:35.736:INFO:Log:1. -> new level
12:35:35.736:INFO:Log:->Req 1.1.
12:35:35.736:INFO:Log:->Req 1.2.
12:35:35.736:INFO:Log:->Req 2.
12:35:35.736:INFO:Log:2. -> new level
12:35:35.737:INFO:Log:->Req 2.1.
12:35:35.737:INFO:Log:->Req 2.2.
12:35:35.737:INFO:Log:->Req 2.3.
12:35:35.737:INFO:Log:->Req 3.
12:35:35.738:INFO:Log:3. -> new level
12:35:35.738:INFO:Log:->Req 3.1.
12:35:35.742:INFO:Log:->Req 3.2.
12:35:35.744:INFO:Log:->Req 3.3.
12:35:35.744:INFO:Log:3.3. new level
12:35:35.744:INFO:Log:->Req 3.3.1.
12:35:35.745:INFO:Log:->Req 3.3.2.
........
12:35:35.756:DEBUG:TreeGrid:isc_TreeGrid_0:delaying adjustOverflow: childClear
12:35:35.866:INFO:Log:tree updated
12:35:35.878:XRP8:INFO:ResultTree:isc_ResultTree_0 (created by:  isc_TreeGrid_0):Updating cache: operationType 'update', 1 rows update data:
[
{id: 32,
parentId: 40,
requirement: "g",
typ: undef,
cluster: undef}
]
12:35:35.878:XRP8:DEBUG:ResultTree:isc_ResultTree_0 (created by:  isc_TreeGrid_0):updated cache: 0 row(s) added, 1 row(s) updated, 0 row(s) removed.

也许有人也经历过类似的问题?我真的不知道如何解决这个问题。

我的SmartGWT版本: 4.1d /SmartClient v9.1d_2013-08-11/LGPL (建于2013-08-11)

EN

回答 1

Stack Overflow用户

发布于 2018-08-23 09:09:19

我不知道树型,但是我有一个简单的菜单树,我通过设置一个新数组来更新节点,将节点的父数组设置为一个整数(转换为字符串),然后通过调用linknodes(arrayOfNodes)方法来更新节点.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18355421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档