【问题标题】:knockoutjs - Multiple dropdowns with same selectedOptions/value observableArrayknockoutjs - 具有相同 selectedOptions/value observableArray 的多个下拉列表
【发布时间】:2015-01-15 13:37:33
【问题描述】:

我有一个淘汰赛 foreach 绑定,可以生成多个下拉列表,包括单选和多选。我不知道会有多少下拉菜单。

所有下拉列表都填充了相同数据类型但已过滤的项目,但是我想从一个 observableArray 中的所有下拉列表中收集所有选定的项目。将相同的 observableArray 绑定到 foreach 循环中的所有下拉列表不起作用,因为它被添加到 observableArray 并立即被其他下拉列表删除。

<script id="multiselect" type="text/html">
    <select class="multi-select" multiple="multiple" data-bind="options: Items, optionsText: 'Name', optionsValue: 'Guid', selectedOptions: $root.selectedItems"></select>
</script>
<script id="singleselect" type="text/html">
    <select class="single-select" data-bind="options: Items, value: $root.selectedItems"></select>
</script>

<div class="separator">
    <!-- ko foreach: distinctItemTypes -->
    <label data-bind="text: ItemType.Name"></label>
    <div>
        <!-- ko template: { name: Count > 1 ? 'multiselect' : 'singleselect' } --><!-- /ko -->
    </div>
    <!-- /ko -->
</div>

这可能吗?或者最好的方法是什么?

【问题讨论】:

    标签: javascript knockout.js drop-down-menu ko.observablearray


    【解决方案1】:

    将每个 select 绑定到不同的 observableArray 以获取包含在您当前循环的项目中的选定值,然后在根级别添加 computed observable 以将它们全部组合在一起:

    var distinctItemType = function() {
      this.selectedOptions = ko.observableArray();
    }
    
    var vm = function() {
      var self = this;
    
      this.distinctItemTypes = ko.observableArray();
    
      this.allSelectedOptions = ko.computed(function() {
        var ret = [];
        for (var x = 0; x < self.distinctItemTypes().length; x++)
          ret = ret.concat(self.distinctItemTypes()[x].selectedOptions());
    
        return ret;
      });
    }
    

    【讨论】:

    • 是的,除非这仅在下拉列表数量为静态时才有效。对我来说,它的变量可以有 1、2、5 或更多的下拉菜单。
    • 您有办法单独更改每个select 绑定的内容吗?查看更多视图模型可能会有所帮助。
    • @Sander 具体来说,distinctItemTypes 是由什么组成的。我认为将选定的选项绑定到每个项目类型将是可行的方法,然后使用类似于我发布的内容将它们全部放在根级别
    • @Sander 已经根据我的理解编辑了这篇文章——对distinctItemTypes 是什么做了一些假设。如果这没有帮助,您能否为您的问题添加更多上下文?
    • 是的,我其实也是这么想的。 distinctItemTypes 由一些属性组成,其中之一是过滤列表。让我们看看我是否可以为所有这些添加一个 observableArray,然后创建一个计算来将它们放在一起。
    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多