0

読み取りと書き込みの両方が可能な合計計算入力ボックスがあります。

<div data-bind="foreach:TotalCostQuantity">
     <input data-bind:"value: Cost, valueUpdate:'afterkeydown'" /><br />
     <input data-bind:"value: Quantity, valueUpdate:'afterkeydown'" />
</div>

私のビューモデルは次のようになります。

self.TrancheCostQuantity = ko.computed({
        read: function () {
            //do some math here to calculate cost and quant totals

            return [{Cost:100, Quantity:10},{Cost:200, Quantity:20}];
        },
        write: function (newValue) {
            customformat(newValue);
        }
    }, self);

コストと数量は、動的な数の行と列を持つことができるグリッドからのものです。ko.mapping プラグインを使用してマッピングされます。

書き込みを実行する必要がありますが、決して実行されません。読み取りは正常に機能しますが、書き込みを検証またはカスタムフォーマットできません。

4

1 に答える 1

1

まず最初に: 例を投稿するときはもっと注意する必要があります。それらが機能することを確認してください:

  • あなたが持っているHTMLではTotalCostQuantity、ビューモデルでは:TrancheCostQuantity
  • HTML では を使用しますdata-bind:"value...が、これはdata-bind="value...

計算されたオブザーバブルの問題は、値を編集するときに含まれている値を変更するが、配列自体は変更しないため、write関数が呼び出されないことです。(これは、たとえノックアウト js がこのように機能したとしても、CostおよびQuantityプロパティが監視可能ではないため、機能しないという事実に加えて)。

実用的なソリューション: http://jsfiddle.net/P2Zqm/

var CostQuantity = function(cost, quantity) {
    self = this;

    self.Cost = ko.observable(cost);
    self.Quantity = ko.observable(quantity);

    self.CustomFormat = ko.computed(function() {
        return parseInt(this.Cost(),10) * parseInt(this.Quantity(),10);
    }, self);
};

var vm = function() {
    self = this;
    self.TotalCostQuantity = ko.computed(function() {
        //do some math here to calculate cost and quant totals

        return [new CostQuantity(100,10), new CostQuantity(200,20)];
    });
};

ko.applyBindings(new vm());
于 2013-07-17T13:28:16.250 に答える