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()
  • 订阅活动
  • 使用
    ko.utils.arrayForEach
    和jQuery
    $.each()循环遍历每个ObservalArray的项
  • 添加带有
    create()
    函数的ko.computed属性作为映射选项的一部分,但我并不真正理解这一点
。如果有人对我如何完成这项看似简单的任务有任何建议,我将不胜感激


大多数失败的尝试都在那把小提琴上的评论中。我得到的最近值是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)"