在可观察数组内部计算的 KO 仅在页面加载时计算,之后不计算

KO computed inside of observable array only computes on page load, and not after that

这是在 Durandal 应用程序中。我有一个名为 Items 的可观察数组,每个项目都有一些属性和 linetotal 的 ko.computed 值。

    self.items = ko.observableArray();
    self.item = function(data) {
        this.sku = ko.observable(data.sku);
        this.description = ko.observable(data.description);
        this.msrp = ko.observable(data.msrp)
        this.sell_price = ko.observable(data.sell_price);
        this.quantity = ko.observable(data.quantity);
        this.tax = ko.observable(data.tax);
        this.linetotal = ko.computed(function() {
            return Number(this.sell_price()) * Number(this.quantity());
        }, this);
    }

    self.activate = function () {
        //make an empty item row
        self.items.push(new self.item({
            sku: "",
            description: "",
            msrp: "",
            sell_price: "2.41",
            quantity: "3",
            tax: "",
        }));

    }

在页面激活时,我在总行字段中得到了 7.23 的预期值:

        <tbody data-bind="foreach: items">
          <tr>
            <td><input type="text" data-bind="attr: { value: $data.sku }"></td>   
            <td><input type="text" data-bind="attr: { value: $data.description }"></td>               
            <td><input type="text" data-bind="attr: { value: $data.msrp }"></td>
            <td><input type="text" data-bind="attr: { value: $data.sell_price }"></td>
            <td><input type="text" data-bind="attr: { value: $data.quantity }"></td>
            <td><input type="text" data-bind="attr: { value: $data.tax }"></td>
            <td data-bind="text: $data.linetotal"></td>           
          </tr>
        </tbody>

但计算函数似乎未绑定到可观察对象,因为更新数量或 sell_price 字段不会更改计算值。我可以 post 一个 js fiddle,但它不会起作用,因为它在 Durandal 应用程序中。

这里是:https://jsfiddle.net/1zcfz1ax/

我是不是处理问题不对?

使用 value 绑定,而不是 attr: { value: foo }

这是清理过的 fiddle

我已将项目 "class" 从视图模型中拉出,因为它不需要存在,删除了多余的 $data.foo 绑定以支持简单的 foo,已更改将值转换为常规数字而不是字符串,因此您以后不必将它们转换为数字。