【问题标题】:bootstrap Dual Listbox knockout binding引导双列表框淘汰赛绑定
【发布时间】:2017-04-21 19:05:17
【问题描述】:

我在我的 ASP.NET MVC 项目中使用bootstrap dual listbox pluging
我也在项目中使用 Knockout。我正在尝试为此插件创建bindingHandler,以使其在淘汰赛中顺利运行。

这是我尝试过的

绑定处理程序

ko.bindingHandlers.dualList = {
    init: function (element, valueAccessor) {
        $(element).bootstrapDualListbox({
            selectorMinimalHeight: 160
        });

        $(element).on('change', function () {
            $(element).bootstrapDualListbox('refresh', true);
        });

        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).bootstrapDualListbox('destroy');
        });
    },
    update: function (element, valueAccessor) {
        $(element).bootstrapDualListbox('refresh', true);
    }
}

HTML

<select class="form-control" data-bind="foreach:{data: EditedElement().Operations, as : 'op'} , dualList: EditedElement().Operations" multiple>
    <option data-bind="value: op.OperationID(), text: op.Name(), selected: op.IsSelected()"></option>
</select>

查看模型

function SelectOperationVM(operationId, isSelected, name) {
    var self = this;

    self.OperationID = ko.observable(operationId);
    self.IsSelected = ko.observable(isSelected);
    self.Name = ko.observable(name);

    self.copy = function () {
        return new SelectOperationVM(self.OperationID(), self.IsSelected(), self.Name());
    }
}

我的问题是,我无法在 viewModel observableArray 和插件之间进行同步。 换句话说,我希望插件中的更改(用户删除了一些选项或添加了一些选项)反映在视图模型属性上,反之亦然

【问题讨论】:

    标签: asp.net-mvc knockout.js bootstrap-duallistbox


    【解决方案1】:

    要同步,您需要将多个可观察对象传递给自定义绑定

    所以你的 html 应该是这样的

    <select class="form-control" data-bind="foreach: { data: Operations, as: 'op'}, dualList: { options: Operations, selected: Selected }" multiple>
        <option data-bind="value: op.OperationID(), text: op.Name(), selected: op.IsSelected()"></option>
    </select>
    

    和自定义绑定就像

    ko.bindingHandlers.dualList = {
      init: function(element, valueAccessor) {
        var data = ko.utils.unwrapObservable(valueAccessor());
        $(element).bootstrapDualListbox({
          selectorMinimalHeight: 160
        });
    
        $(element).on('change', function() {
          // save selected to an observable  
          data.selected($(element).val());;
        });
    
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
          $(element).bootstrapDualListbox('destroy');
        });
      },
      update: function(element, valueAccessor) {
        // to view if there is an update (without this "update" will not fire)
        var options = ko.utils.unwrapObservable(valueAccessor()).options();
        $(element).bootstrapDualListbox('refresh', true);
      }
    }
    

    我还创建了一个肮脏的工作jsfiddle

    【讨论】:

    • 似乎很有帮助,它会检查并根据该检查接受答案。感谢您的时间
    • selected observable 是 undefined,当我在 binding Handler 之外查询它时,您知道可能的原因吗?
    • 非常感谢,这解决了问题,但我不得不说我对您的代码进行了 2 处修改这可能有助于其他人准备好您的答案 第一次修改selectedobservable更改为observableArray 第二次修改我需要将声明var data = ko.utils.unwrapObservable(valueAccessor());移动到change事件内部。能够从binding Handler 外部读取selected 属性非常重要,因为正如我之前所说,我在尝试从模型本身读取此属性时收到null。
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多