Knockout.js 父/子发票逻辑问题
我陷入了父母/孩子被击倒的境地。我有一个从数据列表(发票和详细信息)创建的表。我需要在选中表中的某些复选框时执行特定操作 目前,我有很多工作时,它的框被选中。但当复选框未选中时,只有少数几个目标中的一个起作用。我还没弄明白如何让它工作 下面是我的照片截图Knockout.js 父/子发票逻辑问题,knockout.js,parent-child,Knockout.js,Parent Child,我陷入了父母/孩子被击倒的境地。我有一个从数据列表(发票和详细信息)创建的表。我需要在选中表中的某些复选框时执行特定操作 目前,我有很多工作时,它的框被选中。但当复选框未选中时,只有少数几个目标中的一个起作用。我还没弄明白如何让它工作 下面是我的照片截图 (来源:) 目标 当其中一个或两个“使用信用”复选框都被选中时: 禁用当前上下文中发票和明细项目的“应用”输入-当前正在工作 将顶部金额输入中任何和所有复选框中的到期总金额(贷记金额)作为正值-当前有效 禁用收音机(支票、信用卡、其他)当前
(来源:) 目标 当其中一个或两个“使用信用”复选框都被选中时:
- 禁用当前上下文中发票和明细项目的“应用”输入-当前正在工作
- 将顶部金额输入中任何和所有复选框中的到期总金额(贷记金额)作为正值-当前有效
- 禁用收音机(支票、信用卡、其他)当前正在工作
- 在当前上下文中为发票和明细项目启用“应用”输入-不工作
- 仅从顶部金额输入中删除当前上下文的已检查应付金额-当前正在工作
- 启用收音机-不工作
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);
});
这里有太多的代码要显示,所以请看小提琴。我提出了一种方法,使用绑定到复选框的布尔可观察值与
ko.computed
组合来收集所有选中的详细信息
目前,您正试图将选中的“使用信用”框的每个值添加到一个数组中
在这种方法中,每个细节都有一个useCredit
可观察到的true
或false
。在父视图模型中,如果至少有一个细节具有useCredit()===true
,则会有一个计算数组进行计算
实施:
在详细信息中
:
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>
几乎相同的代码可用于支付
:
self.useCredit = ko.computed(function() {
return self.invoices().some(function(invoice) {
return invoice.useCredit();
})
});
现在,您可以将单选按钮的disable属性绑定到useCredit
或将其重命名为disable
以下是在您的小提琴中实现的这些更改:
另外,如果我是你,我会删除更改事件数据绑定并使用订阅/计算。这很接近。我喜欢您的想法,即使用计算的useCredit来处理禁用状态,我只需要反转数据绑定属性的值。您的解决方案在加载表单时禁用了详细信息输入,此时应启用这些输入,并且仅在选中复选框时才禁用这些输入。另外,我使用该数组作为复选框的原因是收集到期金额,并将所有选中的金额合计到顶部金额字段中,这一点现在还没有完成。我将查看是否可以根据需要重构您的代码。如果您将
some
替换为filter
,Computed将返回一个将useCredit
设置为true的详细信息/发票数组。我喜欢你的新小提琴。禁用状态在加载时仍然不正确,但我修复了它,并进行了一些调整,使其能够正常工作。进入顶部金额字段的值是详细信息的总和,而它必须是到期金额。容易改变。这是工作表。谢谢你的帮助。你救了我。
self.useCredit = ko.computed(function() {
return self.invoices().some(function(invoice) {
return invoice.useCredit();
})
});