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());
}
}
});
}
}
我们想 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());
}
}
});
}
}