我有 ExtJs 的问题combobox
,考虑我有一个combobox
有 4 个项目和一个select
事件 on的回调函数combobox
。
当我要设置combobox
选定的值时setValue()
,ExtJs 不会触发select
事件。
我该如何解决这个问题?
我应该自己触发这个事件setValue()
吗?
我可以告诉你一年前 sencha 支持人员对此有何评论:
好吧,根据定义,事件是由用户操作触发的函数调用,当您调用 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.3select
) 中将 方法的第二个参数设置为true
. 根据源代码,这将触发 select 事件。但是第一个参数必须是一个模型实例。
// source-snipped
select: function(r, /* private */ assert)
所以打电话
combo.select(model, true);
将触发选择事件,但此行为可能随时更改(版本),因为断言被标记为私有
我遇到了这个问题,因为我valueField
在组合框上使用不正确......我不确定这应该做什么,但如果你设置不正确,它会破坏组合框 - 它会阻止change
事件触发并停止select
事件射击不止一次。
我的猜测是,因此您可以在列表中有多个对象代表同一个项目,而 valueField 代表键,因此如果您设置错误,那么键对于所有内容都是未定义的,因此对所有内容都是相同的。这意味着在第一组之后没有任何内容算作新值。
这似乎是非常小众的行为(而不是我想要的),所以我只是在我的情况下将其剥离,然后事情就开始起作用了。
我也认为你想要的事件就是change
事件 -文档(4.1)说
Fires when the value of a field is changed via the setValue method.
而select
仅在有人单击组合框时触发
顺便说一句,但我也会质疑为此使用事件 - 你知道你已经调用了 setValue 那么为什么不做你想要在调用 set value 后发生的事情。事件倾向于使代码更加混乱,如果您不需要多播,那么通常最好不要打扰它们。