所以这是浪费20分钟的好方法。当使用knockout.js在foreach循环中这样绑定时,一切正常。
<tbody data-bind="foreach: LineItems">
<tr>
<td>
<input data-bind="value: Quantity" class="may-frm-grid-input may-frm-grid-input-txt-num" />
</td>
<td><input data-bind="value: UnitPriceExTax" class="may-frm-grid-input may-frm-grid-input-txt-num" /></td>
<td data-bind="text: LineTotalExTax" class="may-frm-grid-val-lbl"></td>
<td>
<input data-bind="value: UnitPriceTaxRate" class="may-frm-grid-input may-frm-grid-input-txt-num" />
</td>
<td data-bind="text: LineTotalTaxAmt" class="may-frm-grid-val-lbl"></td>
<td data-bind="text: LineTotalIncTax" class="may-frm-grid-val-lbl"></td>
</tr>
</tbody>
请注意,绑定只是使用方法名称而不是方法调用ie。 LineTotalExTax不是LineTotalExTax()
但是在下面的foreach之外:
<tbody>
<tr>
<td class="may-frm-grid-lbl-right"></td>
<td class="may-frm-grid-lbl-right"></td>
<td class="may-frm-grid-lbl-right"></td>
<td>
<input data-bind="value: FreightExTax" class="may-frm-grid-input may-frm-grid-input-txt-num" />
</td>
<td>
<input data-bind="value: FreightTaxRate" class="may-frm-grid-input may-frm-grid-input-txt-num" />
</td>
<td data-bind="text: FreightTaxAmt" class="may-frm-grid-val-lbl"></td>
<td data-bind="text: FreightIncTax" class="may-frm-grid-val-lbl"></td>
</tr>
</tbody>
这似乎会产生问题。因此,虽然绑定到这样的计算可观察量时值会被绑定:
function EoiViewModel() {
var self = this;
self.LineItems = ko.observableArray([]);
self.QuoteID = ko.observableArray();
self.CurrencyID = ko.observableArray();
self.FreightExTax = ko.observable(0);
self.FreightTaxRate = ko.observable(0);
self.FreightTaxAmt = ko.computed(function () {
return (self.FreightExTax() * (1 + (self.FreightTaxRate() / 100))) - self.FreightExTax();
});
self.FreightIncTax = ko.computed(function () {
return self.FreightExTax() + self.FreightTaxAmt();
});
self.TotalExTax = ko.observable(0);
self.TotalTaxes = ko.observable(0);
self.TotalIncTax = ko.observable(0);
}
返回的值为:
<td data-bind="text: FreightIncTax" class="may-frm-grid-val-lbl"></td>
对于10的freightextax和1的货运量,将是一个疯狂的恼人的100.11110000。即它使用“+”作为连接操作符而不是添加操作符。
所以我的问题是为什么?我如何在foreach中没有方法调用语法而“逃避”,而不是在循环外的绑定中?
更新:
我还应该添加foreach循环失败绑定是我添加方法“()”语法这么清楚它与范围有关但是什么?
答案 0 :(得分:2)
我认为这与()
没有任何关系。在Knockout中,可以使用或不使用()
来完成对单个可观察或计算的绑定。这是因为Knockout基本上在绑定上运行ko.unwrap()
以获取其值。
你在这里遇到了连接问题,因为尽管可观察量FreightExTax
和FreightTaxRate
最初被分配了数字,但它们变成了字符串,因为它们被限制在一个输入框中。一旦值被修改,它们现在就是字符串。这一行:
return self.FreightExTax() + self.FreightTaxAmt();
成了串联。 parseFloat()修复了它......
return parseFloat(self.FreightExTax()) + self.FreightTaxAmt();
小提琴...... http://jsfiddle.net/VSZE4/