从jQuery的更新变化淘汰赛多选值(Updating Change Knockout Multis

2019-10-23 23:25发布

我正在做一些调整,以使用淘汰赛一个项目,我不能为我的生活弄清楚如何更新从jQuery的一个多选的值。 我敢肯定有办法在淘汰赛做它本身,但它是一个微小的变化,我真的不希望有钻研它。

对于选择框的HTML是这样的:

<select id="projectSelect" 
    data-bind="multiSelect: { items: projects, value: filteredProject, header: false, multiple: false }, 
    optionsText: 'name', 
    optionsValue: 'id', 
    optionsCaption: 'All Projects'" 
    style="display: none;">
</select>

而在淘汰赛这样的定义:

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的运行时,多选的更新与新的价值,但依赖于它的代码永远不会运行,并且无论我做什么我不能强迫淘汰赛更新。 撕裂了我的头发在这里,所以任何帮助将是非常赞赏。

Answer 1:

淘汰赛和jQuery不以这种方式很好地工作。 你真的应该尝试更新视图模型,并让淘汰赛更新视图。 我几乎可以保证,在你目前的做法持续(使用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. }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> <select id="sel" data-bind="options: items, value: currentItem"></select> <hr /> <button id="kiwi">Set KIWI with jQuery</button> <hr /> <pre data-bind="text: ko.toJSON($root)"></pre> 



文章来源: Updating Change Knockout Multiselect value from jQuery