在可观察数组内部计算的 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
,已更改将值转换为常规数字而不是字符串,因此您以后不必将它们转换为数字。
这是在 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
,已更改将值转换为常规数字而不是字符串,因此您以后不必将它们转换为数字。