SingleSelectionModel的正确用法是什么?

时间:2015-03-23 12:00:40

标签: gwt

我们希望从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,我真的看不出原因。另一件事是:正确的方式如何处理项目的选择和选择模型的相关清算?我们是以正确的方式做到的吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您只想收到&#34;点击次数&#34;没有保持&#34;点击&#34;项目已选中,请改用NoSelectionModel;一旦选择了某些东西,就不需要清除选择模型。

关于被调用两次的另一个问题,请仔细检查您是否已经两次添加选择处理程序(如果您可以对DevicesPresenter进行单元测试,则会检查选择模型中的处理程序例如)

答案 1 :(得分:0)

在您的第selectionModel.addSelectionChangeHandler(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());
                                }
                            }
                        });
}
}