【问题标题】:Creating a computed value to calculate the cost doesn't work创建计算值来计算成本不起作用
【发布时间】:2014-01-06 15:10:03
【问题描述】:

我有这个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 不是一个函数。

我怎样才能让它工作?

【问题讨论】:

    标签: javascript mvvm knockout.js


    【解决方案1】:

    您需要对代码进行 2 处更改:

    1. 将您的valoracion 更改为computed function。为什么?因为您希望在任何 observable 值发生更改时重新计算总和值。
    2. 为了使步骤 (1) 能够处理您计算出的 perfiles 数组对象以保存 observable 属性(问题技巧)。

    对于第 2 步,您已经使用 observable 属性定义了 Profile 模型,但是当将对象添加到 perfiles 数组时您没有使用它(我一定想知道为什么?)。要解决此问题,您只需将 init 添加到您的 ViewModel 中,您可以在其中正确构造 perfiles 数组。我希望你明白了。

    DEMO

    更新:

    对于您更新的示例here 不起作用,您在向observableArray 插入新元素时遇到了问题。

    根据Observable Arrays documentation:
    语法更方便。调用KO的push方法,写myObservableArray.push(...)

    所以在 init 函数中更新你的代码以使用:

    1. self.perfiles.push 而不是 self.perfiles().push
    2. self.perfilesValorados.push 而不是 self.perfilesValorados().push

    更新示例的工作版本here

    【讨论】:

    • 感谢您的帮助。我从 json 格式的 asp.net mvc 操作接收所有数据,并认为当我分配像 perfiles(data.perfiles) 这样的值时,这个数组将填充它们的值。我还做了另一个例子,但允许更改时间,但我有同样的问题。这是小提琴:jsfiddle.net/jfmiranda75/nsR9W
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多