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)
 });

これでほぼ動作しますが、値を変更すると文字列に変換されるため、 と の合計18は! これらの文字列を数値に変換する必要があります。121812

 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

少し混乱しました。変更された場合にビューモデルの他の部分が反応できるようにする必要があるすべての値は、監視可能でなければなりません。あなたの場合、オブザーバブルであるオブジェクト「価格」がありますが、このオブジェクトのプロパティ(「価格1」や「価格2」など)はオブザーバブルではありません。これは、「価格」に配置されたオブジェクト全体が新しい値に置き換えられる場合にのみ、計算されたオブザーバブルが更新されることを意味します。

したがって、これらの値を観察可能にするだけです。

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 に答える