2017-09-30 28 views
0

私は以下の観測値を持っていますが、フィールドを更新すると私の合計は更新されません。ノックアウト計算された変数が表示されません

var formdata = ko.observable({ 
    a: 0, 
    b: 0, 
    c: 0, 
    d: 0 
}); 
var calcs = { 
    calulatedValues: function() { 
    this.total = ko.pureComputed(function() { 
     return formdata().a+formdata().b+formdata().c+formdata().d; 
    }); 
    } 
} 

$(function() { 
    ko.applyBindings(formdata, document.getElementByID("myForm")); 
    ko.applyBindings(calcs, document.getElementByID("totals")); 
}); 

<div id="totals"> 
    <div data-bind="with: calculatedValues"> 
    <div data-bind="total"></div> 
    </div> 
</div> 

Fiddle to show what's happening

+0

あなたにも、あなたのFORMDATAのhtmlを示すことができましたか? – Ray

答えて

2

withバインディングは新しいバインディングコンテキストを作成します。だから、にfunctionからそれを変更する必要があります。

var calcs = { 
    calulatedValues: { 
    total: ko.pureComputed(function() { 
     return formdata().a + formdata().b + formdata().c + formdata().d; 
    }); 
    } 
} 

そして、あなたは正しくtotalに結合されていません。 document.getElementByID("totals")にタイプミスがあるので、それはまだ正常に動作しません

<div id="totals"> 
    <div data-bind="with: calculatedValues"> 
    <div data-bind="text: total"></div> 
    </div> 
</div> 

:に変更します。

あなたがabは、c値が変更を取得するときcomputedプロパティがトリガされるようにしたい場合は、あなたは:それはId

ko.applyBindings(calcs, document.getElementById("totals")); 

ここfiddle


が更新ますする必要がありますformdataではなく、observablesとする必要があります。

var formdata = { 
    a: ko.observable(0), 
    b: ko.observable(1), 
    c: ko.observable(0), 
    d: ko.observable(0) 
}; 

とにtotalを変更します。

total: ko.pureComputed(function() { 
    // added the "Number" parsing, otherwise it concatenates numbers as strings 
    return Number(formdata.a()) + Number(formdata.b()) + Number(formdata.c()) + Number(formdata.d()); 
}) 

Updated fiddle

+0

ポスターのように見える2つのビューモデルは2つの異なる領域にバインドされています。 2人のビューモデルが互いに話すようにするために何らかの種類のサブスクライバパブリッシャをセットアップする必要はありませんか? –

+0

@BryanDellingerそれは必須ですか? [このフィドルでは](https://jsfiddle.net/adigas/12kwq2p9/6/)私は 'formdata'の観測可能なプロパティを更新していて、' total'を更新しています。 – adiga

+0

しかし、彼は2つの異なる領域にバインドされた2つのビューモデルを持っています。 ko.applyBindings(formdata、document.getElementByID( "myForm"));ko.applyBindings(calcs、document.getElementByID( "totals")); –

関連する問題