用于bootstrap的Knockout自定义绑定选择不更新viewmodel“selectedCategories / selectedCategory”

时间:2016-03-11 00:01:17

标签: javascript knockout.js custom-binding bootstrap-multiselect

我正在创建一个knockout js自定义绑定,这将允许我使用bootstrap multiselect的数据绑定。我需要它来处理单个<select>并且还要多选<select multiple="true">。我在这个jsfiddle

中这样做

我已经得到它,以便单个和多个选项都可以显示下拉选项,并且随着按钮添加新类别,它们会显示在多选下拉列表中。我还想更新viewmodels selectedItems,其中_selectedCategory为单<select>和'_selectedCategories'为多选。

我在jsfiddle中添加了一些按钮来测试bootstrap multiselect元素。

从下拉列表中选择DOM元素后,如何更新viewmodels _selectedCategories_selectedCategory

代码位于jsfiddle

1 个答案:

答案 0 :(得分:3)

我不确定我是否可以帮助你实现目标,但有些指示:

  1. DOM操作属于绑定处理程序。特别是,初始化:$(this).multiselect({位于init
  2. 传递给初始化的参数对象应该是multiselect绑定的绑定变量。 (我不知道_categoryID的用途是什么。)这将导致update触发。这将是valueAccessor()返回的内容。
  3. 虽然optionsTextoptionsValue应该有简单的字符串参数,但value的参数应该是一个不带引号的可观察名称。这是您提出的问题中的一个关键问题。
  4. 仅包装(直接调用ko.bindingHandlers条目)处理程序,您不需要单独绑定,并且只有当您需要绑定才能成为您正在执行的操作的一部分时。您可能需要打包optionsoptionsTextoptionsValue,而不是将它们包含在data-bind中。但是其中一个。
  5. 更新updated your fiddle处理多选案例。我没有发现selectedOptions绑定处理程序对我有效,所以我不得不把它放在init中。这打破了单选案例;需要特殊情况。

      $(element).change(function (e) {
        var selectedOptions = ko.utils.arrayFilter(Array.from(e.target.options), function (opt) {
          return opt.selected;
        });
        var selectedValues = ko.utils.arrayMap(selectedOptions, function (opt) {
          return opt.value;
        });
        valueAccessor()(selectedValues);
      });