【问题标题】:How to refresh the 'options' binding in an ko multi select component?如何刷新 ko 多选组件中的“选项”绑定?
【发布时间】:2016-04-13 05:35:50
【问题描述】:

我有一个多选组件,我使用“选项”绑定绑定,“选项”会根据我在另一个多选组件中选择的值进行刷新。 下面是第一个多选组件

<select data-bind="multiple: true, required: true, options:repositoriesForSelect, value: selectedRepository"></select>

根据该组件中选择的值,正在刷新第二个组件的选项

<select data-bind=" multiple: true,required: true,options: branchesForSelect,value: selectedBranch"></select>

使用计算变量刷新第二个选项:

 branchesForSelect = ko.computed(function(){
   //selectedRepository is an observable array here
  //some logic

 });

效果很好,但除了上述内容之外,我还想根据在同一组件中选择的值刷新“branchesForSelect”。意思是,如果“branchesForSelect”包含值“A”、“B”、“C”,那么在选择“A”时,我想刷新“branchesForSelect”以在选项列表中仅显示“C”。

有人可以指导我吗?如果问题不清楚,请在 cmets 中告诉我。

谢谢

【问题讨论】:

  • 有什么问题? ko.computed 函数的代码? codepen 或 jsfiddle 可能会有所帮助
  • 我想如何根据我在同一个多选中选择的选项刷新'branchesForSelect'。我不知道该怎么做,我正在寻求解决方案。我知道如何根据第一个多选中选择的选项刷新“branchesForSelect”。清楚了吗?
  • 请提供更多代码,最好是问题本身内的minimal reproducible example。目前有太多的上下文无法猜测。
  • 当然,让我看看,如果可以有一个jsfiddle。会及时通知您

标签: javascript knockout.js multi-select


【解决方案1】:

通过计算第二个选项列表,您走在了正确的轨道上。这就是您仍然需要做的:在计算内部,使用selectedRepository 的值返回一个链接到选择的选项数组。通过使用该值,knockout 将确保在第一个 select 的 value 变量更改后,重新评估第二个选项列表。

在 cmets 中澄清问题后:

从用户体验的角度来看(如果你问我),在用户输入后更改选择本身的值是一个坏主意,但肯定可以做到。下面的代码将向您展示如何操作。当多选的第一个选项处于活动状态时,其他选项将被隐藏。

这是一个例子:

var repositoryBranches = {
  a: ["All", 1, 2, 3, 4, 5, 6],
  b: ["All", 0, 7, 8],
  c: ["All", 9, 10]
};

var VM = function() {
  var self = this;
  
  this.repositoryKeys = ["a", "b", "c"];
  this.selectedRepository = ko.observable("a");
  
  this.selectedBranches = ko.observableArray([]);
  this.branchesForSelectedRepository = ko.computed(function() {
    var allBranchesForRepo = repositoryBranches[self.selectedRepository()];
    // We're making an exception if the first one is selected:
    // don't show any other options if the selected one is the first one
    if (self.selectedBranches()[0] === allBranchesForRepo[0]) {
      return ["All"];
    }
  
    return allBranchesForRepo;
  });
 
  // Clear selection when changing repository
  this.selectedRepository.subscribe(function clearSelection() {
    self.selectedBranches([]);
  });
};

ko.applyBindings(new VM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<select data-bind="options:repositoryKeys, value: selectedRepository">  </select>
<select multiple="true" data-bind="options:branchesForSelectedRepository, selectedOptions: selectedBranches"></select>

(fiddle)

如果您需要帮助找到将“分支”链接到“存储库”的好方法,请告诉我。理想情况下,“存储库”有自己的模型,其中包含一系列“分支”。然后你就可以定义你的计算数组了,比如return self.firstSelection().branches;

【讨论】:

  • 谢谢。但目前上述我已经工作了。我的意思是,在选择某些存储库时,相应分支的选项会正确显示。但我想要的是,在选择了某个分支后如何刷新分支选项。举个例子,如果我为某个存储库选择“所有分支”,则“选项”不应包含该存储库中的任何其他分支。从值中清除“所有分支”后,“选项”应列出该存储库的所有可用分支。请让我知道它是否清楚?谢谢
  • 我想根据在该多选组件本身上选择的值刷新“secondOptions”。
  • 啊,好吧,没从问题中得到答案;对不起。如果您在选择后删除选项,我仍然看不到选择输入将如何工作。您将如何“清除”您的选择?
  • 对不起,如果问题不清楚。我正在使用多选,因此您可以“删除”每个元素
  • 这是你的意思吗? jsfiddle.net/9o932Lq7/1 如果是,我将更新我的答案以反映澄清。
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2014-07-09
  • 1970-01-01
相关资源
最近更新 更多