【发布时间】:2020-12-01 20:39:21
【问题描述】:
所以我有许多使用 Knockout 绑定的 select2 下拉菜单。 最初它似乎工作正常。当用户进行选择时(多选)。模型更新了,生活还不错。 当您从模型中获得要显示为默认选择的值时,我的问题就出现了。 例如在编辑某些东西时。您使用预先填充的值加载表单。
这是我的绑定处理程序
ko.bindingHandlers.select2 = {
init: function (el, valueAccessor, allBindingsAccessor) {
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) {
var allBindings = allBindingsAccessor();
if ("value" in allBindings) {
if ((allBindings.select2.multiple || el.multiple) && allBindings.value().constructor !== Array) {
$(el).val(allBindings.value().split(',')).trigger('change');
} else {
$(el).val(allBindings.value()).trigger('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).trigger("change");
}
};
selectedoptions 绑定到一个 Guid 列表。这是javascript端的字符串列表。 我相信 Select2 选择需要字符串才能设置选定的值。
我的选择如下所示:
<select class="form-control input-sm multi-select" data-bind="selectedOptions: BrandIds, options: Brands, valueAllowUnset: true, optionsText:'Description', optionsValue: 'Value', select2:{ placeholder: 'Please Select...', allowClear: true, multiple:'multiple'}, css: { 'jackpot-input-error': BrandIds.error() && BrandIds.isModified() }" multiple></select>
所以我发现正在发生的是从 BrandIds 中的服务器返回的初始值被删除。我在订阅 BrandIds 时确定了这一点。订阅函数的参数如下所示
[
{
"status": "deleted",
"value": "cd1f6c04-b7ae-479e-b722-65f837e65ec2",
"index": 0
},
{
"status": "deleted",
"value": "bd66ebe1-080b-4455-9094-bf0464d4adbf",
"index": 1
}
]
【问题讨论】:
-
如果你还没有写过这个绑定处理程序(你还没有写过),请链接到你使用过的源代码,以供参考和表扬。
标签: knockout.js jquery-select2