Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过事件总线告知GWT单元小部件数据已更改?_Gwt_Event Bus - Fatal编程技术网

如何通过事件总线告知GWT单元小部件数据已更改?

如何通过事件总线告知GWT单元小部件数据已更改?,gwt,event-bus,Gwt,Event Bus,我有一个GWT单元树,用于显示CMS中的文件结构。我正在使用一个AsyncDataProvider,它从我创建的自定义RPC类加载数据。我还有一个Web套接字系统,它可以从系统中工作的其他客户端广播事件(文件创建、重命名、移动、删除等) 我想弄清楚的是,当我收到其中一个事件时,我如何正确地更新我的细胞树 我想这个问题类似于页面上有两个我的单元树实例,它们显示相同的服务器端数据,并希望确保当用户更新一个时,另一个也会通过使用EventBus更新 我觉得这应该是相当简单的,但我已经花了大约6个小时,

我有一个GWT单元树,用于显示CMS中的文件结构。我正在使用一个
AsyncDataProvider
,它从我创建的自定义RPC类加载数据。我还有一个Web套接字系统,它可以从系统中工作的其他客户端广播事件(文件创建、重命名、移动、删除等)

我想弄清楚的是,当我收到其中一个事件时,我如何正确地更新我的细胞树

我想这个问题类似于页面上有两个我的单元树实例,它们显示相同的服务器端数据,并希望确保当用户更新一个时,另一个也会通过使用
EventBus
更新

我觉得这应该是相当简单的,但我已经花了大约6个小时,现在没有任何进展。我的代码包括在下面:

注意:我没有使用RequestFactory,即使它看起来像是我的自定义RPC框架。此外,FileEntity只是一个文件的简单表示形式,该文件的名称可通过
getName()
访问

private void drawTree(){
//fileService在前面被注入,是我自己的定制rpc服务
TreeViewModel model=newcustomtreemodel(newfiledataprovider(fileService));
CellTree树=新的CellTree(模型,“根”);
tree.setAnimationEnabled(true);
getView().getWorkspace().add(树);
}
私有静态类CustomTreeModel实现TreeViewModel{
//我试图使用一个AsyncDataProvider,因此我有一个可以操作的加载数据点(不确定这是否正确)
公共CustomTreeModel(FileDataProvider dataProvider){
this.provider=提供者;
}
公共节点信息getNodeInfo(最终T值){
如果(!(FileEntity的值实例)){
//我已经在我的演示者中加载了根文件,如果我们位于树的根,我只需通过列表添加它
ListDataProvider dataProvider=新ListDataProvider();
dataProvider.getList().add(TreeWorkspacePresenter.rootFolder);
返回新的DefaultNodeInfo(数据提供程序,
新文件单元();
}否则{
//否则,我知道我们正在加载一些树子数据,我调用AsyncProvider从服务器加载它
provider.setFocusFile(值);
返回新的DefaultNodeInfo(提供程序,
新文件单元();
}
}
公共布尔isLeaf(对象值){
if(value==null | |文件夹的值实例)
返回false;
返回true;
}
}
公共类FileDataProvider扩展了AsyncDataProvider{
私有文件实体焦点文件;
专用文件服务;
@注入
公共文件数据提供程序(文件服务服务){
服务=服务;
}
public void setFocusFile(FileEntity focusFile){
this.focusFile=focusFile;
}
@凌驾
受保护的无效onRangeChanged(HasData显示){
service.getChildren(((文件夹)focusFile),
新接收器(){
@凌驾
成功时公共无效(列出文件){
updateRowData(0,文件);
}
@凌驾
失败时公共无效(可丢弃错误){
Window.alert(error.toString());
}
});
}
}
/**
*用于渲染文件的单元格。
*/
公共静态类FileCell扩展了AbstractCell{
私有文件实体文件;
公共文件实体getFile(){
返回文件;
}
@凌驾
公共void呈现(上下文上下文、文件实体文件、安全HTMLBuilder sb){
如果(文件!=null){
this.file=文件;
sb.appender(file.getName());
}
}
}

您可以使用数据提供程序更新celltree。 您可以使用以下命令更新完整的单元树:

provider.setList(pList);
provider.refresh();
如果您只想更新一个特殊的单元格,您可以从dataprovider获取listwrapper并只设置一个元素

provider.getList().set(12, element);

目前,即使在最新的gwt版本中,也不直接支持单个树项刷新

但有一个解决办法。每个树项都与一个值相关联。使用此值可以获得相应的树项

在您的情况下,我假设您知道要更新/刷新的项目,即您知道哪个文件实体已更改。使用此文件实体搜索相应的树项。获得树项目后,只需展开并折叠或折叠并展开其父项目。这会使父项重新呈现其子项。您更改的文件实体是子实体之一。因此,它得到刷新

public void refreshFileEntity(FileEntity fileEntity)
{
       TreeNode fileEntityNode = getFileEntityNode(fileEntity, cellTree.getRootTreeNode() 

       // For expnad and collapse run this for loop

       for ( int i = 0; i < fileEntityNode.getParent().getChildCount(); i++ )
    {
        if ( !fileEntityNode.getParent().isChildLeaf( i ) )
        {
            fileEntityNode.getParent().setChildOpen( i, true );
        }
    }

}

public TreeNode getFileEntityNode(FileEntity fileEntity, TreeNode treeNode)
{
       if(treeNode.getChildren == null)
       {
           return null;
       }
       for(TreeNode node : treeNode.getChildren())
       {
            if(fileEntity.getId().equals( node.getValue.getId() ))
            {
                 return node;
            }
            getEntityNode(fileEntity, node); 
       }
}
公共无效刷新文件实体(文件实体)
{
TreeNode fileEntityNode=getFileEntityNode(fileEntity,cellTree.getRootTreeNode()
//对于expnad和collapse,运行此For循环
对于(int i=0;i