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