我在使用 ExtJs 的 combobox 时遇到了问题。假设我有一个 combobox,其中有4个项目和一个 select 事件的回调函数。 当我使用 setValue() 来设置 combobox 的选定值时,ExtJs 没有触发 select 事件。
如何解决这个问题?我应该在 setValue() 后手动触发此事件吗?请保留原有的 HTML 标签格式。
如何解决这个问题?我应该在 setValue() 后手动触发此事件吗?请保留原有的 HTML 标签格式。
我可以告诉你一年前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被标记为私有。
valueField
... 我不确定它应该做什么,但如果设置不正确,它会破坏组合框 - 它会阻止change
事件的触发,并且防止select
事件多次触发。
我猜想它的作用是让您可以在列表中拥有代表相同项目的多个对象,而valueField
表示键值,因此如果您将其设置错误,则所有内容的键值都未定义,因此对于所有内容都相同。这意味着第一次设置后没有任何内容被视为新值。
这似乎是非常小众的行为(并不是我想要的),所以在我的情况下我只是将其删除,然后事情开始工作。
另外,我认为您需要的事件是change
事件 - 文档(适用于4.1)如此说明。
Fires when the value of a field is changed via the setValue method.
相比之下,select
仅在某人点击组合框时触发。
稍微离题一点,我也会质疑使用事件来实现这个功能 - 因为你知道你已经调用了setValue,为什么不直接在调用setValue之后执行你想要发生的事情呢?事件往往会使代码更加混乱,如果您不需要多播,则通常最好不要使用它们。
select
事件,我也需要传递参数给事件,对吗?我的意思是select(combo, records, eOpts)
。 - Afshin Mehrabanicombo.fireEvent('select', combo, records);
- Johan Haestchange
事件,而select
事件则在至少选择一个列表项时触发。 - Avinash T.