淘汰赛 - 如何计算每个联系人所选服务的总价格以及所有联系人的总体价格

时间:2014-06-21 08:22:20

标签: javascript jquery knockout.js

我有一个基于淘汰赛的表格,我想计算每个联系人所选服务的总价格......以及所有联系人的整体价格。

这是我的现场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美元


1 个答案:

答案 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。 您还需要考虑以这种方式链接计算的可观察依赖项的影响。非常大的数据会导致大量的数组处理。如果这成为一个问题,你想要改变一种方法,该方法总和一次,然后增加/减少与每次数据修改相加的方法。