如何在Knockout viewmodel中的每个函数内迭代匿名函数

时间:2014-05-17 08:51:12

标签: javascript jquery knockout.js anonymous-function

我正在构建一个Knockout视图模型。该模型包含dateFromDateToStatus等字段。此外,还有一个invoices列表。

发票有一些定价信息,即price个对象。我的主要对象还有一个价格对象,它应该迭代所有发票对象并找到总价格。

我的问题如下:

代码运行顺畅,直到我在视图中添加以下内容:

<label data-bind="text:totalPrice().price().priceExVat"></label>

我在这里得到:

TypeError: $(...).price is not a function

指的是我的:

exVat += $(ele).price().priceExVat;

我不明白,因为在我的每个函数中,我应该有元素。该元素具有price()函数,为什么它不起作用?这是一个范围问题吗?

我的观看模式:

function invoice(invoiceDate, customerName, pdfLink, status) {
    var self = this;
    self.pdfLink = pdfLink;
    self.print = ko.observable(0);
    self.customerName = customerName;
    self.status = status;
    self.pdfPagesCount = function () {
        return 1;
    };
    self.invoiceDate = invoiceDate;

    self.price = function () {
        return new price(1.8, 2.1);
    };
}


function price(exVat, total) {
    var self = this;
    self.currency = '€';
    self.total = total;
    self.priceExVat = exVat;
    self.vatPercentage = 0.25;
    self.vatAmount = self.exVat - self.total;

    self.priceExVatText = function() {
        return self.priceExVat + ' ' + self.currency;
    };
}


var EconomicsViewModel = function (formSelector, data) {
    var self = this;
    self.dateFrom = data.dateFrom;
    self.dateTo = data.dateTo;


    self.invoices = ko.observableArray([
        new invoice('05-05-2014', 'LetterAmazer IvS', "http://www.google.com","not printed"),
        new invoice('05-05-2014', 'LetterAmazer IvS', "http://www.google.com", "not printed")
    ]);

    self.totalPrice = function () {
        var exVat = 0.0;
        $(self.invoices).each(function (index, ele) {
            console.log(ele);
            exVat += $(ele).price().priceExVat;
        });

        return price(exVat, 0);
    };
};

1 个答案:

答案 0 :(得分:3)

根据我的阅读,totalPrice实际上是一个price对象,您不需要放.price()

<label data-bind="text:totalPrice().priceExVat"></label>

修改

抱歉,您的javascript也存在问题:

self.totalPrice = function () {
    var exVat = 0.0;
    $(self.invoices()).each(function (index, ele) { //<-- add () to self.invoices to get the array
        console.log(ele);
        exVat += ele.price().priceExVat; //<-- remove useless jQuery
    });

    return new price(exVat, 0); //<-- add 'new'
};

检查 this fiddle

<强> EDIT2:

要回答robert.westerlund的评论,您可以删除$().each并替换为ko.utils.arrayForEach,甚至更简单地使用for循环:

var arr = self.invoices();
for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);
    exVat += arr[i].price().priceExVat;
}

更新了 fiddle