Parent/child发票逻辑问题

Parent/child Invoice logic issue

我被 Knockout 困在了 parent/child 的境地。我有一个 table 从数据列表(发票和详细信息)创建的。当 table 中的某些复选框被选中时,我需要执行特定的操作。

目前,当复选框被选中时,我有很多工作。但是,当复选框未选中时,只有几个目标中的一个有效。我一直无法弄清楚如何让它工作。

下面是我的截图jsfiddle


(来源:kingwilder.com

Objective

当一个或两个 "Use Credit" 复选框被 选中时:

当一个或两个 "Use Credit" 复选框被 UN-checked:

感谢任何帮助。这是我的工作 jsFiddle:jsFiddle

这是当前在选中复选框时对 UI 进行更新的代码:

self.SelectedItems.subscribe(function(datalist){
  //console.log(ko.toJSON(item));
  var totalAmountSelected = 0;

  console.log("selected list: " + self.SelectedItems().length + " - datalist: " + datalist.length);

  ko.utils.arrayForEach(datalist, function(node){
    totalAmountSelected += parseFloat(node.amountdue() * -1);
    node.Disable(true);
    node.Parent.Disable(true);
    self.Disable(true);
  });

  self.Amount(totalAmountSelected);

});

此处显示的代码太多,请参阅 fiddle。

我提出了一种方法,它使用绑定到您的复选框的布尔可观察值结合 ko.computed 来收集所有选中的详细信息。

目前,您正在尝试将选中的 "use credit" 框的每个值添加到一个数组中。

在这种方法中,每个细节都有一个 useCredit 可观察值,即 truefalse。在父视图模型中,有一个计算数组计算是否至少有一个细节具有 useCredit() === true.

实施:

Detail中:

self.useCredit = ko.observable(false);

像这样绑定使用信用复选框:

<td>
  <div data-bind="visible: amountdue() < 0" class="usecredit">
    <input type="checkbox" data-bind="checked: useCredit" /> Use Credit
  </div>
</td>

另一个输入中的 disable 数据绑定可以直接绑定到取反的 useCredit 值:data-bind="disable: !useCredit()"

现在,计算链一直到 payment 视图模型开始。在 Invoice 中,您根据所有详细信息计算 useCredit 属性:

self.useCredit = ko.computed(function() {
  return self.details().some(function(detail) {
    return detail.useCredit();
  })
});

payment中可以使用几乎相同的代码:

self.useCredit = ko.computed(function() {
  return self.invoices().some(function(invoice) {
    return invoice.useCredit();
  })
});

您现在可以将单选按钮的禁用属性绑定到 useCredit,或者您可以将其重命名为 Disable

这是在您的 fiddle 中实施的这些更改:https://jsfiddle.net/qLrgb9bs/


P.S。如果我是你,我会删除更改事件数据绑定并使用 subscriptions/computeds.