Knockout选择绑定将选择的值更改为错误的选择

时间:2014-05-15 12:05:18

标签: knockout.js

我发现了KO和选择绑定的奇怪行为。使用下面的绑定,当我选择" testa"或" testb",KO更改我的选择,导致选择错误的值。绑定文本值时专门出现问题。如果我将绑定更改为Numbers,KO将按预期工作。我怀疑它是KO的一个错误,但是想先在这里发帖,看看是否有人可以确定我是否做错了。

以下是JSFiddle页面的链接,其中包含以下代码。我尝试了所有版本的KO,问题出现在所有版本中:http://jsfiddle.net/ericeschenbach/C5X2U/此外,我在最新版本的FireFox和Chrome中测试了这个问题,所以我不认为这是与浏览器。

HTML:

Fails:
<select name="a" data-bind="value: ValueText, options: AvailableText, selectedOptions: ValueText, optionsText: 'Text', optionsValue: 'Value', optionsCaption: 'All'"></select>
<br/>
Works:
<select name="b" data-bind="value: ValueNum, options: AvailableNum, selectedOptions: ValueNum, optionsText: 'Text', optionsValue: 'Value', optionsCaption: 'All'"></select>
<br/>

JS:

var self = {};
var availableText = [
    { "Text": "hospital north", "Value": "4" }, 
    { "Text": "hospital south", "Value": "5" }, 
    { "Text": "hospitalEast", "Value": "1" }, 
    { "Text": "johns place", "Value": "6" }, 
    { "Text": "juli", "Value": "8" }, 
    { "Text": "Piedmont", "Value": "2" }, 
    { "Text": "quinn2", "Value": "9" }, 
    { "Text": "test", "Value": "3" }, 
    { "Text": "testa", "Value": "10" }, 
    { "Text": "testb", "Value": "18" }, 
    { "Text": "tim", "Value": "7" }
];
var availableNum = [
    { "Text": "hospital north", "Value": 4 }, 
    { "Text": "hospital south", "Value": 5 }, 
    { "Text": "hospitalEast", "Value": 1 }, 
    { "Text": "johns place", "Value": 6 }, 
    { "Text": "juli", "Value": 8 }, 
    { "Text": "Piedmont", "Value": 2 }, 
    { "Text": "quinn2", "Value": 9 }, 
    { "Text": "test", "Value": 3 }, 
    { "Text": "testa", "Value": 10 }, 
    { "Text": "testb", "Value": 18 }, 
    { "Text": "tim", "Value": 7 }
];

self.ValueText = ko.observable();    
self.ValueNum = ko.observable();    
self.AvailableText = ko.observableArray(availableText);
self.AvailableNum = ko.observableArray(availableNum);
ko.applyBindings(self);

2 个答案:

答案 0 :(得分:2)

看起来你不应该使用selectedOptions: ValueText

From documentation

  

对于多选列表,您可以读取和写入选择状态   使用selectedOptions。从技术上讲,这是一个单独的绑定,所以它   有自己的文档。

此处已更新example

答案 1 :(得分:1)

在处理文本值时,看起来这是淘汰赛选择绑定中的一个错误。这是一个适合您的解决方案。

用此

替换您的选择绑定
<select name="a" data-bind="value: ValueText, options: AvailableText, selectedOptions: ValueText, optionsText: 'Text', optionsValue: function(item){ return Number(item.Value); }, optionsCaption: 'All'"></select>

其中

optionsValue: function(item){ return Number(item.Value); }

是修复淘汰赛的神奇之处。