Javascript 反恐执行局{ self.selected.pushotherUser; } }; }; self.match=函数用户,userToMatch{ var matched=ko.utils.arrayFirstusers,函数用户{ 返回用户==userTo

Javascript 反恐执行局{ self.selected.pushotherUser; } }; }; self.match=函数用户,userToMatch{ var matched=ko.utils.arrayFirstusers,函数用户{ 返回用户==userTo,javascript,jquery,.net,knockout.js,jquery-select2,Javascript,Jquery,.net,Knockout.js,Jquery Select2,反恐执行局{ self.selected.pushotherUser; } }; }; self.match=函数用户,userToMatch{ var matched=ko.utils.arrayFirstusers,函数用户{ 返回用户==userToMatch; }; 返回匹配; }; }; 函数运行{ var vmInstance=新vm; ko.applyBindingsvmInstance; setTimeoutfunction{ vmInstance.add['Jane','Joe

反恐执行局{ self.selected.pushotherUser; } }; }; self.match=函数用户,userToMatch{ var matched=ko.utils.arrayFirstusers,函数用户{ 返回用户==userToMatch; }; 返回匹配; }; }; 函数运行{ var vmInstance=新vm; ko.applyBindingsvmInstance; setTimeoutfunction{ vmInstance.add['Jane','Joe']; }, 5000; } 函数寄存器绑定{ ko.bindingHandlers.select2={ 在:[选项,值]之后, 初始化:函数el、valueAccessor、allBindingsAccessor、viewModel{ $el.select2ko.unwrapvalueAccessor; ko.utils.domNodeDisposal.addDisposeCallbackel,函数{ $el.选择2个“销毁”; }; }, 更新:函数el、valueAccessor、allBindingsAccessor、viewModel{ var allBindings=allBindingsAccessor; var select2=$el.dataselect2; 所有绑定中的if值{ var newValue=+ko.unwrapallBindings.value; 如果allBindings.select2.multiple | | el.multiple&&newValue.constructor!==数组{ 选择2.val[newValue.split,]; } 否则{ 选择2.val[newValue]; } } } } }; 使用者
然后允许用户从下拉列表中添加额外的select或键入其他内容或删除条目-让我们关注粗体部分:据我所知,您有两个下拉列表:一个是您使用select2在此处提供的html;还有一个有一些onChange处理程序,它接受它所选的值并将它们添加到第一个。你能把这个代码添加到你的问题中吗?你好@HeyJude,谢谢你的回答。我只使用了一个下拉列表,但是当屏幕出现时,这些选择是预先填充的。用户可以通过从下拉列表中选择或键入下拉列表中未包含的内容来删除预填充的选择和/或添加新值。出现的问题是,当从值数组填充选择框时,如果下拉列表中不存在其中一个值,则该值不会显示在选择框中。我希望这是有意义的:-我不确定选择是什么,所以让我们更精确,只使用术语选项和值。所以,如果我又错了,请纠正我:您有一个下拉列表,预先填充了多个选项和多个值,用户或代码可以通过从现有选项中选择,或在其中键入一些内容来添加更多值,在这种情况下,选项和值都会被添加。现在,一些代码将不作为现有选项显示的值添加到下拉列表中,并且这些值不会显示。“我猜对了吗?”HeyJude,是的,我想你猜对了!很好,我编辑了我的答案以匹配您的用例。将代码与您的代码进行比较,看看哪里出错了。然后允许用户从下拉列表中添加额外的select或键入其他内容或删除条目-让我们关注粗体部分:据我所知,您有两个下拉列表:一个是您使用select2在此处提供的html;还有一个有一些onChange处理程序,它接受它所选的值并将它们添加到第一个。你能把这个代码添加到你的问题中吗?你好@HeyJude,谢谢你的回答。我只使用了一个下拉列表,但是当屏幕出现时,这些选择是预先填充的。用户可以通过从下拉列表中选择或键入下拉列表中未包含的内容来删除预填充的选择和/或添加新值。出现的问题是,当从值数组填充选择框时,如果下拉列表中不存在其中一个值,则该值不会显示在选择框中。我希望这是有意义的:-我不确定选择是什么,所以让我们更精确,只使用术语选项和值。所以,如果我又错了,请纠正我:您有一个下拉列表,预先填充了多个选项和多个值,用户或代码可以通过从现有选项中选择,或在其中键入一些内容来添加更多值,在这种情况下,选项和值都会被添加。现在,一些代码将不作为现有选项显示的值添加到下拉列表中,并且这些值不会显示。“我猜对了吗?”HeyJude,是的,我想你猜对了!很好,我编辑了我的答案以匹配您的用例。将代码与您的代码进行比较,看看哪里出错了。我仍然无法让select2正常工作!问题是选择框选项绑定到一个数组,该数组包含下拉列表中可用的所有ID和值。SelectedOptions绑定到一个数组,该数组包含SelectedOptions中可能不存在的值列表。如果所选选项不在选项数组中,则所选选项中的值不会显示在选择框中。绑定到选项的数组是其项在下拉列表中显示为选项的唯一数组。因此,如果向数组中添加一个项
绑定到selectedOptions而不首先将此项目添加到绑定到options的数组中,它将不会显示。我仍然无法使select2正常工作!问题是选择框选项绑定到一个数组,该数组包含下拉列表中可用的所有ID和值。SelectedOptions绑定到一个数组,该数组包含SelectedOptions中可能不存在的值列表。如果所选选项不在选项数组中,则所选选项中的值不会显示在选择框中。绑定到选项的数组是其项在下拉列表中显示为选项的唯一数组。因此,如果在绑定到selectedOptions的数组中添加了一个项目,而没有先将该项目添加到绑定到options的数组中,则不会显示该项目。
ko.bindingHandlers.select2 = {
    init: function (el, valueAccessor, allBindingsAccessor, viewModel) {
        ko.utils.domNodeDisposal.addDisposeCallback(el, function () {
            $(el).select2('destroy');
        });

        var allBindings = allBindingsAccessor(),
            select2 = ko.utils.unwrapObservable(allBindings.select2);

        $(el).select2(select2);
    },
    update: function (el, valueAccessor, allBindingsAccessor, viewModel) {
        var allBindings = allBindingsAccessor();

        if ("value" in allBindings) {
            if ((allBindings.select2.multiple || el.multiple) && allBindings.value().constructor != Array) {
                $(el).val(allBindings.value().split(',')).change();
            }
            else {
                $(el).val(allBindings.value()).change();
            }
        } else if ("selectedOptions" in allBindings) {
            var converted = [];
            var textAccessor = function (value) { return value; };
            if ("optionsText" in allBindings) {
                textAccessor = function (value) {
                    var valueAccessor = function (item) { return item; }
                    if ("optionsValue" in allBindings) {
                        valueAccessor = function (item) { return item[allBindings.optionsValue]; }
                    }
                    var items = $.grep(allBindings.options(), function (e) { return valueAccessor(e) == value });
                    if (items.length == 0 || items.length > 1) {
                        return "UNKNOWN";
                    }
                    return items[0][allBindings.optionsText];
                }
            }
            $.each(allBindings.selectedOptions(), function (key, value) {
                converted.push({ id: value, text: textAccessor(value) });
            });
            $(el).select2("data", converted);
        }
        $(el).change();
    }
};