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

时间:2015-05-10 18:28:27

标签: knockout.js durandal

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

    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>

但似乎计算函数未绑定到observable,因为更新quantity或sell_price字段不会更改计算值。我可以发布一个js小提琴,但它不会起作用,因为这是在Durandal应用程序中。

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

我接近这个问题了吗?

1 个答案:

答案 0 :(得分:1)

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

这是一个清理过的fiddle

我已经取消了这个项目#34;&#34;在视图模型之外,因为它不需要在那里,删除了多余的$data.foo绑定而只支持foo,将值更改为常规数而不是字符串,所以你不要#39 ; t必须稍后将它们转换为数字。