这是在淘汰赛中对引导选择的其他实现的轻微改进。
它的作用是订阅值、selectedOptions、选项和禁用绑定中的 observables。
因此,如果您在下面使用“bootstrapSelect”的同一元素上使用“禁用”绑定,那么它将根据您绑定到禁用绑定的可观察对象的值添加或删除禁用类。
ko.bindingHandlers.bootstrapSelect = new function () {
this.after = ['options', 'value', 'selectedOptions'];
this.init = function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var $e = $(element);
var subscriptions = [];
var doRefresh = function () {
$e.selectpicker('refresh');
};
var addSubscription = function (bindingKey, callBack) {
var targetObs = allBindings.get(bindingKey);
if (targetObs && ko.isObservable(targetObs)) {
subscriptions.push(targetObs.subscribe(callBack));
}
};
addSubscription('disable', () => {
$e.addClass('disabled');
doRefresh();
});
addSubscription('options', doRefresh);
addSubscription('value', doRefresh); // Single
addSubscription('selectedOptions', doRefresh); // Multiple
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
while (subscriptions.length) {
subscriptions.pop().dispose();
}
});
};
this.update = function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var $e = $(element);
};
};
export default ko.bindingHandlers.bootstrapSelect;
这是一个例子:
<select class="form-control" data-live-search="true" data-bind="disable: readOnly, bootstrapSelect: { }, options: selectOptions, optionsText: 'name', optionsValue: 'value', value: userValue"></select>
<span class="validationMessage" style="" data-bind="visible: !userValue.isValid() && (userValue.isModified() || userValue.isValidating()), text: userValue.error()"></span>
在这个例子中,我有一个名为 readOnly 的 observable 绑定到禁用绑定,我可以在真假之间切换它。如果我为 readOnly 设置 true ,那么禁用绑定会向元素添加一个“禁用”属性,引导程序选择会忽略该属性。但是在引导选择绑定中对“只读”的订阅将被触发,并导致它检查禁用绑定的值,然后添加或删除引导选择尊重的类“禁用”。
订阅 options、value 和 selectedOptions 还确保在 Bootstrap select 上调用刷新,以使用新选项或选定值更新 gui。