如何在不触发 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']
);

所有列表中的记录,一旦我加载它们,就会被标记为phantomphantom 不能与 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 事件

WPF Tips: Listbox SelectionChanged触发前的选项

当项目具有相同名称时,阻止ComboBox触发SelectionChanged事件?