创建计算值以计算成本不起作用

时间:2013-12-18 12:25:09

标签: javascript mvvm knockout.js

我有这个fiddle的例子。我有一些配置文件和每小时的成本,我正在尝试总和,但它只在第一次工作。如果我修改了某些值,则总和不会更新。

我有这个功能来计算总和:

self.valoracion = function () {
    var total = 0;
    ko.utils.arrayForEach(self.perfilesValorados(), function (item) {
        var tarifa = ko.utils.arrayFirst(self.perfiles(), function(perfil) {
            return perfil.perfil === item.perfil;
        });
        total += parseInt(item.horas) * tarifa.tarifa;
    });
    return total.toFixed(2);
};

但如果我改变它以使其计算,我有一个错误,说perfilesValorados不是一个函数。

我怎么能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

您需要在代码中进行2次更改:

  1. 将您的valoracion更改为computed function。为什么?因为您希望在任何observable值发生更改时重新计算总和值。
  2. 为了让步骤(1)能够处理您计算perfiles的{​​{1}}数组对象以保留valoracion属性(,这就是问题解决方法 )。
  3. 对于第2步,您已经使用observable属性定义了Profile模型,但是当将对象添加到observable数组时,您没有使用它( 我必须想知道为什么? )。要解决此问题,您只需在ViewModel中添加perfiles即可正确构建init数组。我希望你有这个想法。

    DEMO

    更新

    对于无效的更新示例here,您在向perfiles插入新元素时遇到了问题。

    根据Observable Arrays documentation
    语法更方便。要调用KO的推送方法,只需编写observableArray

    即可

    因此,请在init函数中更新代码以使用:

    1. myObservableArray.push(...)代替self.perfiles.push
    2. self.perfiles().push代替self.perfilesValorados.push
    3. 更新后的示例的工作版 here