我想我已经尝试了这一切,但我无法弄清楚这一点。我只是在用户增加数量时尝试更新表格中每行的总价格。到目前为止我已经尝试了
data-bind="text: parseFloat((total * quantity), 10)"
ko.utils.arrayForEach
和jQuery $.each()
create()
函数的ko.computed属性作为映射选项的一部分,但我真的不明白那个。Here's a fiddle 即可。如果有人对如何完成这个看似简单的任务有任何建议我会很感激。
大多数失败的尝试都在关于那个小提琴的评论中。我最接近的是ko.computed,但我只能得到它返回一个值 - 表中最后一行的值。感谢
答案 0 :(得分:1)
我已经实现了一个工作版本,我不太精通淘汰赛,所以我不确定它是否“正确”。
请参阅以下小提琴http://jsfiddle.net/YeSZ8/7/。
我为每一行ItemModel
创建了一个模型。
它的定义如下
var ItemModel = function (arg) {
var that = this;
this.supplier = arg.supplier;
this.itemNumber = arg.itemNumber;
this.description = arg.description;
this.quantity = ko.observable(parseInt(arg.quantity, 10));
this.price = arg.price;
this.total = ko.computed(function () {
return that.price * that.quantity();
});
};
它处理计算新的总价值。我没有使用可能更正确的mapping.fromJSON
,而是手动加载了json并用几行填充了主视图模型。
EDIT2:修复了已损坏的过滤,http://jsfiddle.net/YeSZ8/8/
答案 1 :(得分:1)
这是使用映射插件的解决方案:
....
var mappingOptions = {
'cartItemsList': {
create: function (options) {
var result = ko.mapping.fromJS(options.data, {});
result.total = ko.computed(function () {
return result.quantity() * parseFloat(result.price());
});
return result;
}
}
};
var model = {cartItemsList: JSON.parse(jsonData)};
var viewModel = ko.mapping.fromJS(model, mappingOptions);
viewModel.filter = ko.observable("");
...
答案 2 :(得分:1)
取决于你想要达到的目标。出于简单的显示目的,函数将执行:
viewModel.calcTotal = function ( row ) {
return parseFloat(( row.total() * row.quantity() ), 10);
};
for
循环$data
中有一个特殊变量会传递您的行数据:
<td><span data-bind="text: $root.calcTotal($data)"></span></td>
此外,如果添加括号,您在HTML中使用数学的第一点将起作用。绑定observable的简单形式在表达式中不起作用。
data-bind="text: parseFloat(( total() * quantity() ), 10)"