使用Knockout.js更新选择列表中的值

时间:2014-04-15 17:16:02

标签: javascript knockout.js

我试图通过允许可编辑的价格而不是固定值来修改knockout.js网站上找到的lists and collections tutorial

现在,当页面加载时,列表和数据会正确填充。但是,如果我从列表中选择一个新值,则该行的价格和ID不会更改。总附加费变化,但行本身没有。此外,如果我手动更改给定行的价格,则总附加费不会改变。

我尝试将各个值设置为可观察值,如下所示,但是当选择新的列表项时,价格和ID值仍然不会更新,只有总附加费

function RowReservation(initialRow) {
    var self = this;

    self.row = ko.observable(initialRow);
    self.rowID = ko.observable(self.row().rowID);
    self.price = ko.observable(self.row().price);
}

所以我似乎无法弄清楚这两个问题

  1. 在列表中选择新项目时,相应的价格和ID不会更改

  2. 如果手动更改价格,则总附加费不会更新

  3. 编辑 - 我的列表中的第1个已修复,2个部分已修复。

    如果我更改任一行的其中一个文本框中的价格,则只有在添加了另一行或更改了另一行的名称时才会更新总附加费。基本上,它不是立即改变,它仅在引入新值时计算。我怎样才能让它自动更新?有没有办法订阅价格文本框?**

    Here is an updated fiddle

1 个答案:

答案 0 :(得分:0)

您需要在代码中修改的唯一内容是HTML的第17行中的这部分

<input data-bind="value: price" />

进入

<input data-bind="value: $data.row().price"/>

当你绑定价格&#39;最初,您将它绑定到RowReservation对象的price属性。当&#39;行&#39;价值改变了,价格的价值&#39;属性未更新。因此它仍然显示原始价格。

我更改了绑定,以便显示&#39; row&#39;的价格属性。所以,当&#39; row&#39;通过在组合框中选择不同的项目来更改,价格将更新为新选择的行的价格。

基本上你有

// RowReservationObject

{'row': 
    {'rowName': 'Standard',
     'rowID': 1, 
    'price': 19.99 },   // --> this is what I'm binding against now
'rowID': 1 
'price': 19.99}  // -- this is what you were binding against before

如果稍微更改变量名称,可能会更清楚。 我希望我有道理。