3依赖Select2导致无限循环

时间:2015-04-03 08:27:03

标签: jquery jquery-select2 jquery-select2-4

使用select2来设置3个依赖的下拉列表会对我的项目造成很大的麻烦。

用例:有3个下拉列表:A,B和C.C可以单独选择,A必须具有非默认值B,反之亦然。 在没有select2的情况下执行此操作非常简单,但使用.select2("val"代替普通.val(标准下拉列表会导致问题,即通过重置下拉列表,它会导致更改" -event,甚至如果实际价值没有变化。

小提琴: http://jsfiddle.net/nmeoosLk/7/

这可能是一个解决方案,但它优雅吗? http://jsfiddle.net/8ozv4nr1/

2 个答案:

答案 0 :(得分:0)

这里涉及的一些事情对我们来说很有用。

首先,.select2("val", xyz) is equivalent to .val(xyz).trigger("change")。触发change事件的原因有两个原因

  • 较旧版本的Select2用于触发change事件,因此我们提供了一个简单的升级路径。
  • 页面上的其他组件应该收听change事件,以了解<select>的值何时发生变化,因此触发它是有意义的。

其次,如果您触发<select>事件,则Select2只能知道change的基础值是否会发生变化。

因此,当您将这两个问题结合在一起时,它就会开始解释为什么当您在change事件中设置新值时,Select2不会像您期望的那样行事。


您可以使用change事件来确定何时进行新选择,而不是select2:select事件,从而绕过循环change事件。

https://jsfiddle.net/nmeoosLk/8/

这会锁定您使用特定于Select2的事件,但如果您不想总是检查值是否已更改,则它是您的最佳选择。如果值没有改变,我个人建议不要触发change事件,因为少量代码会更好地帮助其他组件了解页面上发生的事情。

答案 1 :(得分:0)

当您使用Select2 v4时,这是一个通用代码片段,用于进行级联/依赖下拉列表。并且可以链接依赖关系。

使用此模块,selecta列表框的选项将由ajax 加载/刷新,具体取决于另一个select2列表框的选择。

https://gist.github.com/ajaxray/187e7c9a00666a7ffff52a8a69b8bf31

例如 -

new Select2Cascade($('#country'), $('#province'), 'path/to/geocode', {type:"province", parent_id: ''});
new Select2Cascade($('#province'), $('#district'), 'path/to/geocode', {type:"district", parent_id: ''});

在调用ajax之前,父select2列表框的选定值将设置为数据对象的parent_id