我有一个 ExtJS 接口,它解决了我确信很多人以前遇到过的问题。我有一个公开项目列表的服务,我需要在 GridPanel 中显示该列表。我有这部分工作。当我单击其中一项时,我selectionchange
在 GridPanel 的 SelectionModel 中处理该事件,并使用它从另一个 REST 调用加载资源的详细信息。
现在,我希望能够添加一个新项目。这看起来应该很简单,但我想将项目添加到 GridPanel 并同时清除“详细信息”字段,以便用户可以输入新的详细信息并保存完整的项目。我有一个添加按钮,它创建一个输入项目名称的提示。
现在,我将此项目添加到 GridPanel 的后备数据存储区(JsonStore
如果重要的话)并使用getSelectionModel().selectLastRow()
它来突出显示它。当然,这会触发selectionchange
事件,该事件想要加载(不存在的)项目的详细信息。我尝试过使用.purgeListeners()
,进行 `selectLastRow() 调用,然后恢复 selectionchange 侦听器,但由于某种原因,更改的事件仍然会触发——我实际上在 UI 中没有任何症状,但我可以在 Firebug 中看到它正在对项目详细信息进行(失败的)GET 调用。
我想阻止这种情况发生,我觉得这应该是一个常见/简单的问题,但我一直无法找到解决方案。将新项目添加到 GridPanel 而不让您的代码在保存之前尝试“查找”该项目的正确方法是什么?
ETA:一位评论者指出,phantom
Record 对象上有一个属性,这听起来正是我们想要的。但是,当我将我的项目列表加载为
STORE = new Ext.data.JsonStore({
autoLoad: true,
url: 'items'
method: 'GET',
storeId: 'store',
root: 'list',
remoteSort: false,
fields: ['name']
});
列表中的所有记录,一旦我加载它们,就会被标记phantom
。phantom
不适用于 JsonStore ?我应该以另一种方式解决这个问题吗?
ETA 再次:好的,找到了。我没有idProperty
在我的 JsonStore 构造函数上设置属性,这意味着 Records 没有 id,这意味着它们总是phantom
. 现在我的新记录显示phantom
,而已经在数据库中的记录没有。呜呼!