何时在Knock.js绑定中使用方法调用“()”语法

时间:2014-02-12 04:22:03

标签: javascript knockout.js

所以这是浪费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循环失败绑定是我添加方法“()”语法这么清楚它与范围有关但是什么?

1 个答案:

答案 0 :(得分:2)

我认为这与()没有任何关系。在Knockout中,可以使用或不使用()来完成对单个可观察或计算的绑定。这是因为Knockout基本上在绑定上运行ko.unwrap()以获取其值。

你在这里遇到了连接问题,因为尽管可观察量FreightExTaxFreightTaxRate最初被分配了数字,但它们变成了字符串,因为它们被限制在一个输入框中。一旦值被修改,它们现在就是字符串。这一行:

return self.FreightExTax() + self.FreightTaxAmt();

成了串联。 parseFloat()修复了它......

return parseFloat(self.FreightExTax()) + self.FreightTaxAmt();

小提琴...... http://jsfiddle.net/VSZE4/