我正在构建一个Knockout视图模型。该模型包含dateFrom
,DateTo
,Status
等字段。此外,还有一个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);
};
};
答案 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