除非使用setTimeout,否则引导程序多选selectAll不能与Knockout.js一起使用

yfjy0ee7  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(87)

显然,Bootstrap multiselect在使用jQuery multiselect()和Knockout.js时有一个限制,因此,如果在Knockout事件(在下面的示例中为click事件)期间代码修改了多选下拉列表,则不会应用该代码。
下面的示例对此进行了演示:
1.首先,按一下左边的按钮。您会看到虽然选项已建立,但并未选取。您需要再按一下,才能选取它们。
1.然后,点击右边的按钮。你会看到选项被创建和选中。我使用了1000毫秒的超时,但它也只使用了1毫秒的超时。
我的问题:有没有比超时更好的方法来使selectAll()工作?
第一个

pcww981p

pcww981p1#

您的问题在于代码执行顺序。内置的KO options绑定处理程序和jQuery多选插件都在修改DOM,并且options处理程序可能在多选函数 * 之后 * 执行,因此当您构建多选菜单时,还没有任何选项可供选择。当您使用setTimeout时,即使有1ms的超时,函数被压入到调用栈的末尾,并在当前事件循环结束时执行(更多详细信息请参见here),因此现在它是在options绑定结束后执行的。因此,它可以正常工作。
然而,这并不是很好,在视图模型中执行DOM操作从来都不是一个好主意。来轻松地与DOM元素交互并保持视图模型的整洁。您的代码引用了一个multiselect绑定处理程序,但我在您的帖子中没有看到它。如果我们创建它(这并不复杂),我们将看到我们可以使菜单如预期的那样工作。您最初的问题是您使用了提供的绑定处理程序以及手动操作DOM。您应该只使用绑定处理程序,它'我会很好地工作,不需要暂停。
对于KO这样的框架,一般来说,你只需要操作视图模型中的数据,KO应该完成更新UI的繁重工作。因此,如果你想选择所有项目,考虑一下它是如何工作的:有一个可观察到的数组selected,其中存储了所选项目的ID。因此,如果要选择所有项目,只需遍历所有可用项目,并将ID推送到所选数组。KO将负责为您更新UI。请参阅更新后的代码片段。我创建了一个单独的按钮,用于调用selectAll函数。但是如果愿意,当然可以在init函数中调用selectAll
第一个

相关问题