Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 击倒、要求并选择2_Javascript_Jquery_Knockout.js_Requirejs_Jquery Select2 - Fatal编程技术网

Javascript 击倒、要求并选择2

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,

所以这里有一个有趣的问题,我遇到了击倒,要求和选择2。我必须分享,因为这花了太长时间才弄明白。我试图做的是从一个可观察的数组创建一个动态创建的select2选择列表。数组包含一个名为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);
                });
            }
        };