Javascript 击倒、要求并选择2
所以这里有一个有趣的问题,我遇到了击倒,要求和选择2。我必须分享,因为这花了太长时间才弄明白。我试图做的是从一个可观察的数组创建一个动态创建的select2选择列表。数组包含一个名为Id的项。选择列表如下所示:Javascript 击倒、要求并选择2,javascript,jquery,knockout.js,requirejs,jquery-select2,Javascript,Jquery,Knockout.js,Requirejs,Jquery Select2,所以这里有一个有趣的问题,我遇到了击倒,要求和选择2。我必须分享,因为这花了太长时间才弄明白。我试图做的是从一个可观察的数组创建一个动态创建的select2选择列表。数组包含一个名为Id的项。选择列表如下所示: <select data-bind=" options: $root.Items, optionsValue: 'Id', optionsText: 'FullName', value: Id,
<select data-bind="
options: $root.Items,
optionsValue: 'Id',
optionsText: 'FullName',
value: Id,
select2: {}"></select>
ko.bindingHandlers.select2 = {
init: function (element, valueAccessor, allBindingsAccessor) {
var obj = valueAccessor(),
allBindings = allBindingsAccessor(),
lookupKey = allBindings.lookupKey;
$(element).select2(obj);
if (lookupKey) {
var value = ko.utils.unwrapObservable(allBindings.value);
$(element).select2('data', ko.utils.arrayFirst(obj.data.results, function (item) {
return item[lookupKey] === value;
}));
}
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).select2('destroy');
});
},
update: function (element) {
$(element).trigger('change');
}
};
我遇到的问题是这个。当我从动态创建的选择列表中选择新项时,将永远不会调用update方法。所以,我要做的是:
<select data-bind="
options: $root.Items,
optionsValue: 'Id',
optionsText: 'FullName',
value: Id,
select2: Id"></select>
如您所见,我必须告诉init函数通过传入一个空白对象{}从头创建一个select2对象,并且必须通过传入Id作为要监听的可观测对象来告诉更新函数哪个可观测对象要监听。现在,当底层的select list change事件触发时,我告诉可观察的Id进行更新
我希望这对其他人有所帮助,因为我有很多日日夜夜都在努力弄清楚为什么底层select不会在定制绑定处理程序上触发update方法
请原谅任何打字错误或代码错误……如果有人发现问题,我会及时更新,我总是愿意听到任何其他更优雅的解决方案……我还没有找到。你能在某个地方把问题总结得更好一点吗?我已经多次将这三个工具一起使用,而不必使用任何变通方法……我使用的是您第一次发布的绑定处理程序,没有任何问题。我不认为更新会触发,除非你的obserablearray被修改
ko.bindingHandlers.select2 = {
init: function(element, valueAccessor, allBindingsAccessor) {
var obj = valueAccessor(),
allBindings = allBindingsAccessor(),
lookupKey = allBindings.lookupKey;
$(element).select2({});
if (lookupKey) {
var value = ko.utils.unwrapObservable(allBindings.value);
$(element).select2('data', ko.utils.arrayFirst(obj.data.results, function(item) {
return item[lookupKey] === value;
}));
}
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).select2('destroy');
});
},
update: function (element, valueAccessor, allBindingsAccessor) {
$(element).on("change", function () {
var id = $(this).val();
var valAccesor = valueAccessor();
if (valAccesor && id && id > 0)
valAccesor(id);
});
}
};