javascript - Knockout.js Select2 绑定(bind)。 Select2 升级到 v4 后出现故障

标签 javascript knockout.js jquery-select2

最近的 Select2 升级似乎破坏了我的一些 knockout 绑定(bind),我现在无法完全让 select 正确显示选项。损坏的选择的选项旨在基于可观察数组books进行更新,并设置可观察book。我可以看到 bindingHandler.update 被调用,并且选项数据存在于 valueAcessor 中,但页面上没有任何更新。

html

<select name="book_choice" id="book_selector" class="form-control input-sm"
      data-bind="
          select2: {
              value: book,
              options: function(){return {results: books(), text:'id'}},
              optionsText: bookFormat,
              optionsValue: bookFormat,
              placeholder:'-- Select Book --'
          }
      "
></select>

js

ko.bindingHandlers.select2 = {

    init: function(el, valueAccessor, allBindingsAccessor) {

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

        ko.utils.domNodeDisposal.addDisposeCallback(el, function() {
            $(el).select2('destroy');
        });

        $(el).select2(select2);

        // update select2 if value is set elsewhere
        select2.value.subscribe(function(newValue){
            if (newValue){
                $(el).val(newValue.id);
            }
        });

        $(el).on("select2:select", function(event){
            var allBindings = allBindingsAccessor();
            if (event.choice){
                allBindings.select2.value(event.choice);
            }
        });
    },

    update: function(el, valueAccessor, allBindings, viewModel, bindingContext) {
        var obj = valueAccessor();
        $(el).select2("data", obj.options());

        console.log(obj.options());

        if (_.contains(obj.options().results, obj.value())){
            $(el).val(obj.value().id);
        }else{
            obj.value(null);
        }

        $(el).prop('disable', !obj.options().results.length > 0);
        $(el).trigger('change');
    }
};

我尝试了许多不同的修复,但这与 v4 升级之前的代码非常相似。

最佳答案

这是我的 select2 绑定(bind)。我的情况是在模式对话框中使用 select2。

init: function (el, valueAccessor, allBindingsAccessor, viewModel) {
        var bindingId = "#" + valueAccessor() + "";
        var value = allBindingsAccessor().value;
        ko.utils.domNodeDisposal.addDisposeCallback(el, function () {
            $(el).select2('destroy');
        });
      //  $("#myModalCreate")
        $(el).select2({
            dropdownParent: $(bindingId),
            width: '100%'
        });
        // update select2 if value is set elsewhere            
            value.subscribe(function (newValue) {
                if (newValue != undefined) {
                    $(el).val(newValue).trigger('change');
                }
            });


    },
    update: function (el, valueAccessor, allBindingsAccessor, viewModel) {

        var value = valueAccessor();
        var valueUnwrapped = ko.utils.unwrapObservable(value);
        $(el).val(valueUnwrapped).trigger('change');
    }

用法:

<select data-bind="select2: 'myModalCreate',options: $root.departmentGroup, optionsText: 'Text', optionsValue: 'Value', value: DepartmentGroup" class="col-xs-12 "></select>

DepartmentGroup 是可观察的。 $root.departmentGroup 是 observableArray() 就像: self.departmentGroup = ko.observableArray(JSON.parse('[{"Value": 0, "Text": "Retail"},{"Value": 1, "Text": "Demonstrator"}]'))

希望这对您有帮助!

关于javascript - Knockout.js Select2 绑定(bind)。 Select2 升级到 v4 后出现故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42699436/

相关文章:

javascript - 用JavaScript演奏旋律

javascript - 使用 Moment JS 在聊天应用程序中设置时间格式

javascript - 使用 Ajax 源设置 select2 元素初始值的简单示例?

jquery - 通过 jQuery 追加后,Select 2 不起作用

javascript - 表单验证条件与 react

javascript - alert() 不适用于 PHP,而是打印在控制台上

javascript - 集合教程中的 ko.observable 变量

javascript - 从外部文件向 javascript 模块模式添加代码

javascript - 使用 knockoutjs 将多个 css 类与 <li> 元素绑定(bind)

jquery - 未捕获的 TypeError : $s2. select2 不是函数