【问题标题】:Populating a dropdown with an observable array in knockout.js在 knockout.js 中使用可观察数组填充下拉列表
【发布时间】:2014-06-26 03:49:01
【问题描述】:

我有 X 个使用 Knockout 动态创建的下拉菜单,现在我想为每个下拉菜单预选一个选项。巧合的是,我有一个可观察的数组,其中包含与我想要选择的选项相对应的 X 条目。如何使用这个数组来选择我的选项?

示例视图模型:

function AppViewModel() {
    var self = this;
    self.array = ko.observable(["Dog","Cat"]);
}

在这个例子中,我有两个下拉菜单,它们都有一个“狗”和“猫”选项。我想为第一个下拉菜单选择“狗”,为第二个下拉菜单选择“猫”。

这是我的 HTML:

<div data-bind="foreach: array">
      <label>
        <select data-bind="options: array"></select>
      </label>
</div>

【问题讨论】:

  • 如果您的要求真的那么简单,您可以在 foreach 中使用 $index() 来访问选定的值:jsfiddle.net/pvF43
  • @nemesv 这正是我所需要的。当您需要根据数组的索引进行填充时,$index() 是一种方法。谢谢!

标签: knockout.js ko.observablearray


【解决方案1】:

根据docs,您需要为您选择的绑定设置value 绑定。

function AppViewModel() {
    var self = this;
    self.array = ko.observable(["Dog","Cat"]);
    self.selected = ko.observable(self.array()[0]);
}

然后:

<select data-bind="options: array, value: selected "></select>

示例:http://jsfiddle.net/H6DL5/

如果您有很多这样的下拉菜单,那么您可以使用一组子虚拟机作为结果。像这样的:

function AppViewModel() {
    var self = this;
    self.array = ko.observable(["Dog", "Cat", "Weasel"]);
    self.dropDowns = ko.observableArray([
    new SubVM("Dog"),
    new SubVM("Cat")]);
}

function SubVM(selected) {
    var self = this;
    self.selected = ko.observable(selected);
}

你可以这样绑定:

<div data-bind="foreach:dropDowns">
    <select data-bind="options: $parent.array, value: selected "></select>
</div>

现在您可以根据需要添加任意数量的下拉列表,只需将它们添加到父 VM 中的 dropDowns 数组即可。

例如:http://jsfiddle.net/H6DL5/1/

如果您需要在每个下拉列表中使用不同的选项,只需将可用选项的数组添加到您的 SubVM 并绑定 options 而不是父列表。

【讨论】:

  • 我的下拉列表数量与我在数组中的元素数量相同,所以我不想只是硬编码一个选定的值。
  • @user3757174:您需要将实际选择的值放在某个地方,不是吗?您可以创建一个值数组,但最好创建一个具有选定值的子 VM。
  • 当然,但我不会总是有 2 个下拉菜单——可能还有更多,这取决于传入的数据。也许我应该动态创建 observables?
  • @user3757174:我会在您的 ViewModel 中使用一组子虚拟机,但我并不完全清楚您从哪里获取选项列表以及从哪里获取选定项目列表?所有下拉菜单的可用选项列表是否应该相同?
  • 所有下拉菜单的可用选项列表都是相同的,但我想要选择的选项列表是我根据用户的一些输入计算得出的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2019-05-21
  • 2020-11-07
  • 2018-11-26
  • 2017-09-28
相关资源
最近更新 更多