gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:45:53 25 4
gpt4 key购买 nike

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

我想要解决的是当我收到这些事件之一时,我如何正确更新我的细胞树?

我想这个问题类似于页面上有两个 Cell Tree 实例,它们呈现相同的服务器端数据,并希望通过使用 EventBus 来确保当用户更新一个时,另一个也更新.

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

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

private void drawTree() {

// fileService is injected earlier on and is my own custom rpc service
TreeViewModel model = new CustomTreeModel(new FileDataProvider(fileService));
CellTree tree = new CellTree(model, "Root");

tree.setAnimationEnabled(true);

getView().getWorkspace().add(tree);

}

private static class CustomTreeModel implements TreeViewModel {

// I am trying to use a single AsyncDataProvider so I have a single point of loading data which I can manipulate (Not sure if this is the correct way to go)
public CustomTreeModel(FileDataProvider dataProvider) {
this.provider = provider;
}


public <T> NodeInfo<?> getNodeInfo(final T value) {

if (!(value instanceof FileEntity)) {

// I already have the root File loaded in my presenter, if we are at the root of the tree, I just add it via a list here
ListDataProvider<FileEntity> dataProvider = new ListDataProvider<FileEntity>();

dataProvider.getList().add(TreeWorkspacePresenter.rootFolder);

return new DefaultNodeInfo<FileEntity>(dataProvider,
new FileCell());
} else {

// Otherwise I know that we are loading some tree child data, and I invoke the AsyncProvider to load it from the server
provider.setFocusFile(value);

return new DefaultNodeInfo<FileEntity>(provider,
new FileCell());
}
}

public boolean isLeaf(Object value) {

if(value == null || value instanceof Folder)
return false;
return true;
}

}

public class FileDataProvider extends AsyncDataProvider<FileEntity> {

private FileEntity focusFile;
private FileService service;

@Inject
public FileDataProvider(FileService service){
this.service = service;
}

public void setFocusFile(FileEntity focusFile){
this.focusFile = focusFile;
}

@Override
protected void onRangeChanged(HasData<FileEntity> display) {


service.getChildren(((Folder) focusFile),
new Reciever<List<FileEntity>>() {

@Override
public void onSuccess(List<FileEntity> files) {

updateRowData(0, files);

}

@Override
public void onFailure(Throwable error) {

Window.alert(error.toString());
}

});

}
}



/**
* The cell used to render Files.
*/
public static class FileCell extends AbstractCell<FileEntity> {

private FileEntity file;

public FileEntity getFile() {
return file;

}

@Override
public void render(Context context, FileEntity file, SafeHtmlBuilder sb) {
if (file != null) {
this.file = file;
sb.appendEscaped(file.getName());
}
}
}

最佳答案

目前,即使在最新的 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);
}
}

关于gwt - 如何通过事件总线告诉 GWT 单元小部件数据已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com