簡體   English   中英

Select2具有Knockout.js初始值

[英]Select2 with Knockout.js inital value

我將Select2與kickout.js一起使用。

但是控件沒有正確顯示初始值。 似乎沒有引發選擇功能

我修改了一個現有的jsbin來演示我的問題。

http://jsbin.com/xufovura/6/edit

綁定:

<div data-bind="value: selectedState, select2: { data: states, placeholder: 'Select a State', formatResult: format ,initSelection: initSelect}" class="select2" style="width: 200px"></div>

自定義綁定的一部分(jsbin中的完整代碼):

ko.bindingHandlers.select2 = {
    init: function(el, valueAccessor, allBindingsAccessor, viewModel) {
      ko.utils.domNodeDisposal.addDisposeCallback(el, function() {
    $(el).select2('destroy');
});

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

      $(el).select2(select2);

    }
};

 function initSelect(element, callback) {
   console.log("initSelect");
          var selectedItems = $.grep(this.states, function (e) { return e.id == element.id; });

           console.log(element);


            callback(selectedItems[0]);
        }

未調用initSelect函數的原因是Select2認為已選擇了您的占位符。 Select2讀取$(element).val() ,如果結果為false,則認為該占位符已被選中。

您的div元素將始終為val()結果返回“”。

您應該將div元素切換為輸入元素,但是當我在jsBin中執行此操作時,我發現輸入的值尚未通過敲除進行初始化。 這是值綁定的時間問題,因為調用select2綁定的init函數時尚未調用值綁定的更新函數。

淘汰賽首先調用所有初始化函數,然后調用更新函數。

不使用select元素時,Select2在淘汰賽中表現不佳!

一種快速而骯臟的解決方案是在調用select2插件之前確保已設置元素的值。

init: function(el, valueAccessor, allBindingsAccessor, viewModel) {
  ko.utils.domNodeDisposal.addDisposeCallback(el, function() {
    $(el).select2('destroy');
  });

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

  // Ensure the input's value is set before calling select2
  $(el).val(allBindings.value());
  $(el).select2(select2);      
}

您也不再需要initSelected選項,實際上,由於$.grep(this.states, ...)而導致的jsBin失敗,此時“ this”未引用視圖模型。

您還需要注意,移至Knockout 3.x時allBindingsAccessor會更改


更長,更完整的答案包括設置處理程序以處理各種select2事件,以及手動訂閱支持值,以在更新方法需要時將手動調用與$(el).select2('data', ...)進行協調$(el).select2('data', ...)您的綁定。

如果將后備存儲更改為對象而不是僅更改為字符串值(例如,存儲實際的“狀態”對象,而不僅僅是其id),則也需要這種方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM