从jQuery更新Change Knockout Multiselect值

我正在努力对使用Knockout的项目进行一些调整,我不能在我的生活中弄清楚如何从jQuery更新多选的值。 我确信在Knockout中有原生方式可以做到这一点,但这是一个微小的变化,我真的不想深入研究它。

选择框的html是这样的:

  

并在Knockout中定义如下:

 this.filteredProject = ko.observable(null); this.filteredProject.subscribe(function(projectId) { for (var i = 0; i < self.projects.length; i++) if (self.projects[i].id == projectId) { self.filteredProjectObject(self.projects[i]); self.selectedProjectCheckboxDisabled(false); return } self.onlyShowHoursForSelectedProject(false); self.selectedProjectCheckboxDisabled(true); self.filteredProjectObject(null) }); this.filteredProjectObject = ko.observable(null); 

我目前的jQuery是:

 var projSelect = $("#projectSelect"); projSelect.val(projId).change(); projSelect.multiselect("refresh").change() 

并且jQuery按下按钮运行。

当jQuery运行时,multiselect使用新值更新,但绑定到它的代码永远不会运行,无论我做什么,我都不能强制Knockout更新。 在这里撕扯我的头发,所以任何帮助都将非常感激。

Knockout和jQuery以这种方式不能很好地工作。 您应该尝试更新ViewModel,并让Knockout更新视图。 我几乎可以保证坚持你当前的方法(使用jQuery来更新DOM,并让KnockoutJS 对此做出响应 )从长远来看势必会更加困难和麻烦。

但是,如果你坚持,我认为你需要使用trigger通过常规DOM事件通知KnockoutJS,选择了不同的选择选项。 对于您的代码可能是:

 projSelect.val(projId).trigger('change'); 

为了演示这将如何工作:

 var ViewModel = function() { var self = this; self.items = ["apple", "orange", "kiwi"]; self.currentItem = ko.observable(null); }; var vm = new ViewModel(); ko.applyBindings(vm); $('#kiwi').on("click", function() { $("#sel").val("kiwi").trigger('change'); // Major hack! Try to avoid needing this. });