Jquery 剔除每行的总值
我想我已经试过了所有的方法,但是我想不出来。我只是想在用户增加数量时更新表中每一行的总价。到目前为止我已经试过了Jquery 剔除每行的总值,jquery,knockout.js,knockout-mapping-plugin,Jquery,Knockout.js,Knockout Mapping Plugin,我想我已经试过了所有的方法,但是我想不出来。我只是想在用户增加数量时更新表中每一行的总价。到目前为止我已经试过了 HTML中的数学:data bind=“text:parseFloat((总数*数量),10)” 使用ko.computed() 订阅活动 使用ko.utils.arrayForEach和jQuery$.each()循环遍历每个ObservalArray的项 添加带有create()函数的ko.computed属性作为映射选项的一部分,但我并不真正理解这一点 。如果有人对我如何完
- HTML中的数学:
data bind=“text:parseFloat((总数*数量),10)”
- 使用ko.computed()
- 订阅活动
- 使用
和jQueryko.utils.arrayForEach
$.each()循环遍历每个ObservalArray的项
- 添加带有
函数的ko.computed属性作为映射选项的一部分,但我并不真正理解这一点create()
大多数失败的尝试都在那把小提琴上的评论中。我得到的最近值是ko.computed,但我只能让它返回一个值——表中最后一行的值。谢谢我已经实现了一个工作版本,虽然我不太精通击倒,所以我不确定它是否“正确” 看下面的小提琴 我为每一行创建了一个名为
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并用几行填充主视图模型
编辑:我读了一些关于映射插件的文章,我得出结论,应该将它与create方法一起使用来启动ItemModel实例
EDIT2:修复了中断的过滤,下面是一个使用映射插件的解决方案:
....
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("");
...
调整后的小提琴:取决于你想要达到的目标。出于简单的显示目的,功能将执行以下操作:
viewModel.calcTotal = function ( row ) {
return parseFloat(( row.total() * row.quantity() ), 10);
};
在循环$data
中有一个特殊变量,它将传递行数据:
<td><span data-bind="text: $root.calcTotal($data)"></span></td>
谢谢雨果。你知道如何使用映射插件来实现吗?@MarkB我自己没有使用映射插件,但我假设你应该能够为数组中的每个元素创建一个create
回退,并使initiate成为ItemModel
的一个实例。再次感谢,但这就是我最后一个要点被卡住的地方。@MarkB我正在努力,几乎可以用映射插件来完成。我也在努力,我感谢你的帮助。很好,很简单,正是我想要的。谢谢你的帮助!筛选在这一个上不起作用。我相信我可以通过一些修改让它工作,但是在这篇文章中选择的答案是一个非常简单的选择。谢谢你的帮助
data-bind="text: parseFloat(( total() * quantity() ), 10)"