如何在不触发 selectionchanged 事件的情况下将项目添加到 ExtJS GridPanel
Posted
技术标签:
【中文标题】如何在不触发 selectionchanged 事件的情况下将项目添加到 ExtJS GridPanel【英文标题】:How to add an item to an ExtJS GridPanel without firing selectionchanged event 【发布时间】:2011-04-04 21:39:16 【问题描述】:我有一个 ExtJS 界面来解决我确信 吨 人以前遇到过的问题。我有一个公开项目列表的服务,我需要在 GridPanel 中显示该列表。我有这部分工作。当我单击其中一项时,我会处理 GridPanel 的 SelectionModel 中的selectionchange
事件,并使用它从另一个 REST 调用中加载资源的详细信息。
现在,我希望能够添加一个新项目。这看起来应该很简单,但我想将项目添加到 GridPanel 并同时清除“详细信息”字段,以便用户可以输入新的详细信息并保存完整的项目。我有一个添加按钮,它创建一个输入项目名称的提示。
现在,我将此项目添加到 GridPanel 的后备数据存储区(如果重要,则添加 JsonStore
)并使用 getSelectionModel().selectLastRow()
突出显示它。当然,这会触发selectionchange
事件,该事件想要加载(不存在的)项目的详细信息。我已经尝试使用.purgeListeners()
,进行`selectLastRow() 调用,然后恢复 selectionchange 监听器,但由于某种原因,更改的事件仍然会触发——我实际上在 UI 中没有任何症状,但我可以在 Firebug 中看到它正在对项目详细信息进行(失败的)GET 调用。
我想阻止这种情况发生,我觉得这应该是一个常见/简单的问题,但我一直无法找到解决方案。将新项目添加到 GridPanel 而不让代码在保存之前尝试“查找”项目的正确方法是什么?
ETA:一位评论者指出,Record 对象上有一个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
而那些已经在数据库中的则没有。呜呜!
【问题讨论】:
【参考方案1】:我宁愿这样做,而不会弄乱我已经设置的事件链或处理程序。
一种简单的方法似乎类似于 -“在 selectionchange 侦听器中以某种方式弄清楚被选择的记录是否是持久记录(还)”
“弄清楚”部分可以通过检查record.phantom 来实现,正如 Kevin 在下面的 cmets 中所建议的那样
【讨论】:
+1,但您不必实施跟踪。它已经作为 record.phantom 可用,除非记录是由阅读器创建的,否则它是 bool true。 凯文,如果你给出了完整的答案,我会接受。这正是我希望找到的。以上是关于如何在不触发 selectionchanged 事件的情况下将项目添加到 ExtJS GridPanel的主要内容,如果未能解决你的问题,请参考以下文章
我怎么知道之前触发了SelectionChange过程的行号?
XAML 组合框 SelectionChanged 触发 OnLoad
2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
.NET Core 3.1 更新交互触发器和 Prism 后没有触发 SelectionChanged 事件