5

我似乎无法计算出这项工作的价值。任何意见将不胜感激。

我从服务器获取我的价格值。

 var pModel = function () {
     var self = this;
     self.prices = ko.observable({ "ID": 1,"Price1": 12,"Price2": 12});

     self.Total = ko.computed(function () {
         var total = 0;
         total = self.prices().Price1 + self.prices().Price2;
         return total;
     });
 };
 var VModel = new pModel();
 ko.applyBindings(VModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/2.1.0/knockout-min.js"></script>
<form action='/someServerSideHandler'>
    <table>
        <thead>
            <tr>Prices</tr>
        </thead>
        <tbody id="calc">
            <tr>
                <td>Price 1</td>
                <td>
                    <input data-bind='value: prices().Price1' />
                </td>
            </tr>
            <tr>
                <td>price 2</td>
                <td>
                    <input data-bind='value: prices().Price2' />
                </td>
            </tr>
            <td>TOTAL</td>
            <td> <span data-bind="text: $root.Total"></span>
            </td>
        </tbody>
    </table>
</form>

4

2 回答 2

4

您的prices变量是可观察的,但它的成员不是。像这样重新定义它:

 self.prices = ko.observable({
     ID: ko.observable(1),
     Price1: ko.observable(12),
     Price2: ko.observable(12)
 });

现在,这几乎可以工作了,但是如果您更改值,它会将它们转换为字符串,因此 和 的总和18121812!我们需要将这些字符串转换为数字。

 self.Total = ko.computed(function () {
     var price1 = parseFloat(self.prices().Price1());
     var price2 = parseFloat(self.prices().Price2());
     return price1 + price2;
 });

你应该准备好了!

于 2013-03-18T17:49:47.507 回答
3

你把事情搞混了一点:你的视图模型的其他部分应该能够在改变时做出反应的每个值都必须是可观察的。在您的情况下,您有一个可观察的对象“价格”,但该对象的属性(例如“Price1”和“Price2”)不是可观察的。这意味着,仅当放置在“价格”中的整个对象被新值替换时,您计算的 observable 才会更新。

因此,只需使这些值可观察:

var pModel = function () {
    var self = this;

    self.prices = {
        "ID": 1, // IDs normally do not change so no observable required here
        "Price1": ko.observable(12),
        "Price2": ko.observable(12)
    };

    self.Total = ko.computed(function () {
        return +self.prices.Price1() + +self.prices.Price2();
    });
};

演示:http: //jsfiddle.net/Jjgvx/3/

于 2013-03-18T17:47:59.377 回答