我有一个基于淘汰赛的表格,我想计算每个联系人所选服务的总价格......以及所有联系人的整体价格。
这是我的现场DEMO:http://jsfiddle.net/yzmcD/3/
例如:
- First Name: John
- Last Name: Carter
- Selected Services:
- Service One (price: 30 $)
- Service Two (price: 10 $)
- Debt: 40 $
- First Name: Arnold
- Last Name: Cruise
- Selected Services:
- Service One (price: 20 $)
- Service Two (price: 10 $)
- Service Three (price: 30 $)
- Debt: 60 $
总计:100美元
答案 0 :(得分:0)
问题:
selectedId
的Catalog
不仅存储服务ID。我更喜欢持有服务对象的变量,它应该被命名以反映它。Catalog
应该不存储selectedId
,或者您不应将Catalog
个对象存储为联系人的service
。如果要将此数据序列化为JSON
,那么您将获得大量不必要的数据重复。 由于您要创建一个对象以在多个位置表示联系人,因此请创建一个Contact
函数来封装它。这也将允许容器保存计算器以计算每Contact
function Contact(data) {
var self = this;
self.debt = data.debt,
self.firstName = data.firstName,
self.lastName = data.lastName,
self.services = ko.observableArray(data.services),
self.total = ko.computed(function () {
var total = 0;
var serviceItems = self.services()
ko.utils.arrayForEach(serviceItems, function (service) {
if (service.selectedId()) {
total += parseInt(service.selectedId().price);
}
})
return total;
})
}
最后,ContactsModel
需要一个计算来计算所有联系人的总数
self.contactsTotal = ko.computed(function () {
var total = 0;
ko.utils.arrayForEach(self.contacts(), function (contact) {
total += contact.total();
})
return total;
})
我将必要的计算可观察量添加到the fiddle。 您还需要考虑以这种方式链接计算的可观察依赖项的影响。非常大的数据会导致大量的数组处理。如果这成为一个问题,你想要改变一种方法,该方法总和一次,然后增加/减少与每次数据修改相加的方法。