2012-06-11 42 views
0

我在我的视图模型中有对象的集合。将值绑定到select控件时遇到问题。该值是一个JS对象而不是原始类型。当我在绑定集合中有多个对象并更改select控件时,其他所有对象的值都会更新为新选定的对象。就好像所有的值都绑定在foreach绑定中的同一个实例上。该错误似乎只在插入新行时发生,而不是简单地编辑现有行时。更改一个对象的可观察属性更改集合中的所有属性

我已经列出了很多复杂性,并有一个例子显示JSFiddle的问题。

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

步骤,看看错误

  1. 选择定居类型从下拉列1
  2. 下来从新下拉到正确的选择“二”。
  3. 从第2行的下拉列表中选择结算类型
  4. 现在,行1和行2都将在选择框中设置为“One”。

我期望在一行中的更改不会影响任何其他行。

回答

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

每次你选择不同的selectedDatabaseField它重建availableOptions.options。每行都与这些选项绑定在一起。当选项被重建时,每行的选定值不再是有效的选择。

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

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

因此,如果已经创建了选项,您可能不希望重新生成这些选项,或者您希望每行都有单独的选项,而不是针对同一个数据库字段对象进行绑定。

+0

对于解决这个问题,你会在代码变更方面提出什么建议?我真的想要缓存'DatabaseField'信息,因为它最终会碰到服务器。 此外,为什么这种相同的效果不会发生在'availableTabs'上? “foreach”中的所有项都绑定到父项的选项卡列表,但可以在不影响表中的其他行的情况下更改它们。 – arb

+1

可能是这样的:http://jsfiddle.net/rniemeyer/5vgDy/54/。只要检查这些选项是否已经在字段中填充,而不是每次都重新填充它们。 –

相关问题