改变一个对象的可观察属性改变了All in Collection的属性

时间:2012-06-11 22:55:39

标签: javascript data-binding knockout.js

我的视图模型中有一组对象。将值绑定到select控件时遇到问题。该值是JS对象,而不是基本类型。当我在绑定集合中有多个对象并更改select控件时,所有其他对象的值都将更新为新选择的值。就像所有值都绑定到foreach绑定中的同一个实例一样。只有在插入新行时才会出现错误,而不是仅仅在编辑现有行时。

我已经解决了很多复杂问题,并在JSFiddle上有一个显示问题的例子。

http://jsfiddle.net/zero21xxx/5vgDy/

查看错误的步骤

  1. 从第1行的下拉列表中选择结算类型
  2. 从新的下拉菜单中选择“两个”。
  3. 从第2行的下拉列表中选择结算类型
  4. 现在,第1行和第2行都将在选择框中设置为“One”。
  5. 我希望一行中的更改不会影响任何其他行。

2 个答案:

答案 0 :(得分:1)

如果你设置它有点复杂,但是,我认为问题是,你的id不是你所期望的,

 function getValues(tabId) {
                console.log("tabId " + tabId);
                if (lookUp[tabId]) {

如果我将它添加到你的代码中,它会显示相同的tabId,这意味着你通过它的外观处理相同的对象。

如果我每次更改getValues

 function getValues(tabId) {
                console.log("tabId " + tabId);
                return  [new DatabaseField(nextId(), "Name", "Attorney Name", DataType.STRING.id),
                                                             new DatabaseField(nextId(), 
"Type", "Settle Type", DataType.DROPDOWN.id)];
}

我也用[]改变了所有可观察到的可观察数组...

然后它似乎工作。小提琴... http://jsfiddle.net/keith_nicholas/wmxJX/

答案 1 :(得分:1)

每次您选择其他selectedDatabaseField时,它都会重建availableOptions.options。每个行都与选项绑定在相同的选项上。重建选项后,每行的选定值不再是有效选项。

即使对象看起来完全相同,它也不相等,除非它是对同一对象的引用。

因此,由于选项已更改且当前选定的值不再有效,value绑定将指定第一个选项作为值(除非您指定了optionsCaption)。

因此,您可能不希望重建选项,如果它们已经构建,或者您希望每行都有单独的选项,而不是绑定到同一个数据库字段对象。