【问题标题】:GXT 3 ToggleButtonCell not updating data storeGXT 3 ToggleButtonCell 未更新数据存储
【发布时间】:2014-03-26 20:46:32
【问题描述】:

我有一个 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 & column 配置声明如下:

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 接口的意义所在。

额外的怪异之处,网格在角落显示红色三角形,表示单击时单元格是脏的,并且按钮在单击时正确显示,即它保持向下或向上。它似乎没有读取或更新数据存储。

【问题讨论】:

  • 嗯,代码看起来不错,假设 InspectionListGridData 有一个布尔属性 isPosted/getPosted/setPosted。我刚刚在本地调整了 sencha.com/examples/#ExamplePlace:inlineeditablegrid,以便在粘贴时或多或少地使用 ToggleButtonCell 而不是其 True/False 自定义单元格,它似乎表现得如预期......
  • 一条线索:我的 ListStore 似乎没有设置为自动提交。我认为设置的一些花哨的代理/加载器可能已经禁用了它,所以我需要做一些手动提交。继续调查。
  • 哦,哎呀,我看错了你的问题 - 我会在几个中发布部分答案,但你的部分问题仍然没有意义......

标签: java gwt gxt


【解决方案1】:

这里有两个问题,一开始我只关闭了第一个(我仍然无法回答,但更多信息可能会有所帮助),但第二个很清楚。

当我加载这个屏幕时,按钮没有初始化到数据指示的相应状态。

正如我在评论中指出的那样,这令人困惑,并且与我放在一起的快速示例相矛盾,这可能是您在绘制网格后更改数据,而不是通知商店或网格数据已更改,但是如果您使用真值和假值构建数据,则网格应该同时显示真值和假值。

我在 InspectionListGridData.setPosted() 方法上设置了断点,当我点击按钮时它不会被调用。

默认情况下,这是预期的,而store.isAutoCommmit() 为真,这是默认值。这告诉存储它应该排队更改而不是直接将它们应用到存储中的对象。这些更改的值在 UI 中用您注意到的红色三角形标记,其他代码可以通过 Store.getRecord(M) 方法或 Store.getModifiedRecords() 调用检查更改的值。调用store.commitChanges() 会将它们全部应用于底层模型,或者您可以使用Record.commit() 提交特定模型。您也可以使用Store.rejectChanges()Record.revert() 拒绝更改。

当它关闭时,应该通过单击按钮调用 setPosted 方法。不会发生更改跟踪,因此不会在视觉上或在商店记录中设置脏标志。

如果您更改已渲染的对象,您有两个(主要)选择 - 您可以直接通过其设置器修改对象并通知商店,或者您可以使用商店的记录对象。如果 autocommit 为 false 并且您调用 store.getRecord(object).addChange(properties.posted(), true),那么将调用 setPosted(true),而不是创建要提交的新更改,因此当 autocommit 为 false 时,这些方法实际上是相同的。如果直接调用setter,一定要通过store.update通知store对象发生了变化。

【讨论】:

  • 是的,事实证明我的第一个问题,关于未填充的值,是错误的,是由于另一个错误。
  • 这看起来像是我的问题的答案,谢谢。我没有明确地将 autoCommit 设置为 false (或任何其他值),是否有任何原因可能会发生这种情况?该代码正在使用 PagingProxy 和 PagingLoader(我的代码 sn-ps 中未包含),它们会导致自动提交设置为 false 吗?
  • 我从源代码中看到,Store 类的自动提交默认为 false,所以显然这是我的问题。
  • Store.autoCommit 默认为 false,因为大多数情况下都想进行脏检查,所以如果你想忽略它,你需要打开它。
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2020-01-29
  • 2012-06-15
  • 2019-06-29
  • 1970-01-01
相关资源
最近更新 更多