SingleSelectionModel 的正确用法是什么?

What is the right usage for the SingleSelectionModel?

我们想 link 从 CellTable 到 属性 编辑器页面。当用户单击某个项目时,我们使用 SingleSelectionModel 来获得通知。 它是这样初始化的:

private final SingleSelectionModel<Device> selectionModel = new SingleSelectionModel<Device>();

然后我们分配选择更改处理程序:

selectionModel.addSelectionChangeHandler(this);

我们的选择更改处理程序如下所示:

@Override
public void onSelectionChange(SelectionChangeEvent event) {
    Log.debug("DevicesPresenter:  SelectionChangeEvent caught.");
    Device selectedDevice = selectionModel.getSelectedObject();
    if (selectedDevice != null) {
        selectionModel.clear();
        if (selectionModel.getSelectedObject() != null){
            Log.debug("DevicesPresenter:  selected item is " + selectionModel.getSelectedObject());
        }
        else{
            Log.debug("DevicesPresenter:  selected item is null");
        }

        deviceEditorDialog.setCurrentDevice(selectedDevice.getUuid());
        // get the container data for this device
        clientModelProvider.fetchContainersForDevice(selectedDevice.getUuid());
        PlaceRequest request = new PlaceRequest.Builder()
        .nameToken(NameTokens.deviceInfo)
        .with("uuid", selectedDevice.getUuid())
        .build();
        Log.debug("Navigating to " + request.toString());
        placeManager.revealPlace(request);
    }
}

现在有两个问题:似乎总是同时出现两个 SelectionChangeEvents,我真的不明白为什么。另一件事是:如何正确处理项目选择和选择模型的相关清算?我们这样做的方式正确吗?

谢谢!

如果您只想收到 "clicks" 的通知而不想保持选中 "clicked" 项,请改用 NoSelectionModel;无需在选择内容后立即清除选择模型。

至于被调用两次的其他问题,请仔细检查您是否没有两次添加选择处理程序(如果您可以对 DevicesPresenter 进行单元测试,请自省选择模型中的处理程序示例)

在你的行 selectionModel.addSelectionChangeHandler(this); 中,this 指的是什么?

这是我的代码,我是如何使用的 SingleSelectionModel

public class MyClass{
        private final SingleSelectionModel<CountryDto> selectionModel = new SingleSelectionModel<CountryDto>();
    ...
public MyClass(){
         cellTable.setSelectionModel(selectionModel);
         selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
                            @Override
                            public void onSelectionChange(SelectionChangeEvent event) {
                                CountryDto selected = selectionModel
                                        .getSelectedObject();
                                if (selected != null) {
                                    Window.alert("Selected country "+selected.getTitle());
                                }
                            }
                        });
}
}