奇怪的淘汰js选择选项绑定问题

时间:2013-04-24 05:35:53

标签: javascript knockout.js

有没有人花一点时间来看看我在Knockout JS和绑定选择列表时遇到的一个令人费解的问题?

应该通过在选择列表中调用value: favColorId而不是使用基于函数的value: favColorId()调用来在列表中选择此人最喜欢的颜色,这里发生了一些非常奇怪的事情,我过去从未使用过(),它也会导致一些其他奇怪的问题,它不会回想起跨度中的值(因此更改所选项目什么都不做)..我尝试重新创建一个简单的样本,我可以展示最好的这个问题。

http://jsfiddle.net/goneale/ph8Jw/

1 个答案:

答案 0 :(得分:1)

  

我已经包含了我的mapDictToArray()功能,但它只是转换了一个   将javascript对象转换为键值JS数组。我不这么认为   造成这个问题。

实际上,这是问题的一部分。该函数返回一个JavaScript数组,而不是一个可观察的数组,因此Knockout无法正确使用它。我对您的代码进行了以下更改:

// The "mapDictToArray" makes a normal JS array, not a ko.observableArray();
// You can't simply "merge" a JS array with an observableArray(); you'll need
// some extra functionality for that: ko.utils.arrayPushAll()
// viewModel.colors(mapDictToArray(dict));
ko.utils.arrayPushAll(viewModel.colors(), mapDictToArray(dict));

// Apply the bindings *after* you've added the contents to the "colors" observable, in order to
// get the correct selected value
ko.applyBindings(viewModel);

这应该可以解决问题(使用没有()的正确HTML)!

JSFiddle

<强>更新

我想到了我的解决方案,但事情并不正确。唯一正确的是,你需要在中添加可观察颜色的内容之后应用绑定的部分。 This is your fiddle,该部分向下移动。

这适用于 ,但是当arrayPushAll中已有数据时,您需要使用observableArray方法。此方法合并,而在不使用它时覆盖它(example with data inside the observable)。