ExtJs在ComboBox上没有触发select事件。

19
我在使用 ExtJs 的 combobox 时遇到了问题。假设我有一个 combobox,其中有4个项目和一个 select 事件的回调函数。 当我使用 setValue() 来设置 combobox 的选定值时,ExtJs 没有触发 select 事件。
如何解决这个问题?我应该在 setValue() 后手动触发此事件吗?请保留原有的 HTML 标签格式。
2个回答

21

我可以告诉你一年前sencha支持所说的:

好吧,事件(event)按定义是由用户操作触发的函数调用,而当您调用select时并没有用户操作。

不管怎样,"修复"很简单:您知道您调用了select,因此在调用select之后,可以立即调用您的select监听函数。

这取决于您的情况应该做什么。对我来说,我改变了我的实现方式,以便我能够调用负责的方法,但另一方面,当您自己触发事件时,我也没有看到任何不利影响。因此,我认为哪种方法更好是由您决定的。

以下是一个示例,说明如何自行触发事件(部分引自@JohanHaest的评论)

为了简单起见,假设只启用了单选功能

var record = combo.store.getById(id);
combo.select(id);
combo.fireEvent('select', combo, record);
或者
combo.select(model);
combo.fireEvent('select', combo, model);

在当前版本(4.1.3)中,当在select方法上设置第二个参数为true时,可能存在一个黑客攻击的风险。根据源代码,这将触发选择事件。但第一个参数必须是模型实例。

// source-snipped
select: function(r, /* private */ assert)

所以称之为

combo.select(model, true);

将触发选择事件,但此行为可能随时更改(版本),因为assert被标记为私有。


好的,但是如果我手动触发 select 事件,我也需要传递参数给事件,对吗?我的意思是 select(combo, records, eOpts) - Afshin Mehrabani
3
以下代码触发事件:combo.fireEvent('select', combo, records); - Johan Haest
1
@AfshinMehrabani 好的,除了你必须从绑定到组合框的存储中自己获取记录之外,没有什么可说的了。 - sra
@AfshinMehrabani...setValue()会触发change事件,而select事件则在至少选择一个列表项时触发。 - Avinash T.
2
@AvinashT。不,那是错误的。当选择器关闭时,事件不会被触发。你必须使用一个hack来实现这个,就像我在我的编辑中所述。 - sra
显示剩余6条评论

3
我遇到这个问题是因为我错误地在组合框上使用了valueField... 我不确定它应该做什么,但如果设置不正确,它会破坏组合框 - 它会阻止change事件的触发,并且防止select事件多次触发。

我猜想它的作用是让您可以在列表中拥有代表相同项目的多个对象,而valueField表示键值,因此如果您将其设置错误,则所有内容的键值都未定义,因此对于所有内容都相同。这意味着第一次设置后没有任何内容被视为新值。

这似乎是非常小众的行为(并不是我想要的),所以在我的情况下我只是将其删除,然后事情开始工作。


另外,我认为您需要的事件是change事件 - 文档(适用于4.1)如此说明。

Fires when the value of a field is changed via the setValue method.

相比之下,select 仅在某人点击组合框时触发。

稍微离题一点,我也会质疑使用事件来实现这个功能 - 因为你知道你已经调用了setValue,为什么不直接在调用setValue之后执行你想要发生的事情呢?事件往往会使代码更加混乱,如果您不需要多播,则通常最好不要使用它们。


非常感谢!我有一些测试数据与相同的值组合在一起,但我无法触发更改。 - Djomla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接