1

我正在尝试使用淘汰赛填充下拉列表。我用来填充 optionsText 的数组是一个 JSON 对象数组。我需要 optionsValue 是数组中对象的索引或序号。

我的 viewModel 中有以下代码:

    self.job.submitOptionsArray = this.collection.toJSON();
    this.job.applyPreset = ko.observableArray(self.job.submitOptionsArray);

在我看来:

<select name="" id="applyPreset" data-bind="options: applyPreset, optionsText: 'name', optionsValue: '???', value: somfn"></select>

我需要一个不使用 jQuery 的解决方案。

4

3 回答 3

1

除了使用选项绑定之外,您可能会发现在您的情况下使用 foreach 绑定手动创建选项更有益。

例如:

<select data-bind="value: someValue, foreach: options">
    <option data-bind="text: title, attr: {value: $index()}"></option>
</select>
<div data-bind="text: someValue"></div>

你的选择可以是任何东西,我只是用这个测试了它:

self.options = ko.observableArray([{
   title: "Some text",
   otherData: "someOtherData",
   evenMore: "even more Data"
 }, {
   title: "Some text 2",
   otherData: "someOtherData",
   evenMore: "even more Data"
 }, {
   title: "Some text 2",
   otherData: "someOtherData",
   evenMore: "even more Data"
 }]);

如果要包含标题,只需将 foreach 绑定移动到虚拟元素中,然后在其余选项上方手动添加一个选项。

于 2013-01-06T14:56:35.077 回答
1

您可以格式化您的对象,以便根据您的收藏获得索引。您可以通过手动订阅执行一次或每次更改阵列时执行此操作。

this.job.applyPreset = ko.observableArray(self.job.submitOptionsArray);
this.job.applyPreset.subscribe(function(arrayValue) {
    var index = 0;
    ko.utils.arrayForEach(arrayValue, function(arrayItem){
        arrayItem.index = index++;
    })
})

用作index你的optionsValue,你已经设置好了。

于 2013-01-06T18:09:34.990 回答
0

You will have to fix that yourself, the optionsValue can only point to a member on the object. If you do not supply the optionsValue the value will be the object itself.

If the object has an id member use that, or use a computed observable with a write method that writes the actual index instead of the object a underlying observable..

于 2013-01-06T14:53:41.317 回答