GXT 3 ToggleButtonCell不更新数据存储

时间:2014-03-26 20:46:33

标签: java gwt gxt

我有一个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接口的重点。

奖励额外的怪异,网格显示角落中的红色三角形,表示单击时单元格是脏的,点击时按钮确实显示正确,即它保持向下或向上。它似乎无法读取或更新数据存储。

1 个答案:

答案 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通知商店该对象已更改。