我有一个GXT 3应用程序,我尝试使用ToggleButtonCell来允许用户修改布尔值。
这是数据的代码:
public class InspectionListGridData {
private Boolean posted;
public InspectionListGridData(InspectionListGridData dataToCopy) {
setPosted(dataToCopy.getPosted());
}
public Boolean getPosted() {
return posted;
}
public void setPosted(Boolean posted) {
this.posted = posted;
}
}
为了让网格访问数据,我提供了这个属性访问接口:
interface ListProperties extends PropertyAccess<InspectionListGridData> {
ValueProvider<InspectionListGridData, Boolean> posted();
}
Grid&amp;列配置声明如下:
final ListProperties properties = GWT.create(ListProperties.class);
final List<ColumnConfig<InspectionListGridData,?>> columnConfigList = new ArrayList<ColumnConfig<InspectionListGridData,?>>();
final ListStore<InspectionListGridData> store = new ListStore<InspectionListGridData>(
new ModelKeyProvider<InspectionListGridData>() {
@Override
public String getKey(InspectionListGridData item) {
return item.getInspectionDocumentId().toString();
}
}
});
final ColumnConfig<InspectionListGridData, Boolean> postedColumnConfig = new ColumnConfig<InspectionListGridData, Boolean>(properties.posted(), 5, "Posted");
ToggleButtonCell postedButtonCell = new ToggleButtonCell();
postedButtonCell.setText("posted");
postedButtonCell.setIcon(SafedoorPM.localizedResources.postedIcon());
postedButtonCell.setIconAlign(IconAlign.TOP);
postedColumnConfig.setCell(postedButtonCell);
postedColumnConfig.setSortable(false);
columnConfigList.add(postedColumnConfig);
Grid<InspectionListGridData> inspectionListGrid = new Grid<InspectionListGridData>(store, columnModel);
当我加载此屏幕时,按钮不会初始化为数据指示的相应状态。 [编辑:初始值的加载失败是由于不同的错误。一旦我修复了正确加载的初始值]
一旦加载了屏幕,如果我点击一个按钮就会改变状态,但商店没有更新。我在InspectionListGridData.setPosted()方法上设置了断点,当我点击按钮时它没有被调用。
谁能看到我做错了什么?或者我认为这应该只是工作我错了?我认为这是ValueProvider接口的重点。
奖励额外的怪异,网格显示角落中的红色三角形,表示单击时单元格是脏的,点击时按钮确实显示正确,即它保持向下或向上。它似乎无法读取或更新数据存储。
答案 0 :(得分:1)
这里有两个问题,起初我只关闭了第一个问题(我仍然无法回答,但更多信息可能会有所帮助),但第二个问题非常明确。
当我加载此屏幕时,按钮不会初始化为数据指示的相应状态。
这是令人困惑的,并且与我放在一起的快速示例相矛盾,正如我在评论中指出的那样,可能是您在绘制网格后更改数据而未通知商店或网格数据已更改,但如果要使用true和false值构建数据,则网格应显示true和false值。
我在InspectionListGridData.setPosted()方法上设置断点,当我点击按钮时不会调用它。
默认情况下,这是store.isAutoCommmit()
为真时的预期值,这是默认值。这告诉商店它应该排队更改,而不是直接将它们应用于商店中的对象。这些更改的值在UI中标记为您注意到的红色三角形,其他代码可以通过Store.getRecord(M)
方法或Store.getModifiedRecords()
调用检查更改的值。调用store.commitChanges()
会将所有这些应用于基础模型,或者您可以使用Record.commit()
提交特定模型。您也可以使用Store.rejectChanges()
或Record.revert()
拒绝更改。
关闭此选项后,应通过单击按钮调用setPosted方法。不会发生更改跟踪,因此不会在视觉上或在商店的记录中设置脏标记。
如果更改已经渲染的对象,则有两个(主要)选择 - 您可以通过其setter直接修改对象并通知商店,或者您可以使用商店的记录对象。如果autocommit为false并且您调用store.getRecord(object).addChange(properties.posted(), true)
,则不会创建要提交的新更改,而是调用setPosted(true)
,因此当autocommit为false时,这些方法实际上是相同的。如果直接调用setter,请务必通过store.update
通知商店该对象已更改。