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