ノックアウトでは...次のようなことをする必要があります:
function Xxx(val)
{
var self = this;
this.x = ko.observable(val);
this.change = function() {
// "that" may be different to "self" in some
// cases...
var that = this;
$.ajax({
url: '...',
type: 'get',
success: function(data) {
self.x(5);
},
error: function(a) {
console.log('got an error');
}
});
};
}
var newX = new Xxx(1);
newX.change();
ko.computed(function () {
// This will get called everytime
// newX.x is changed
console.log(newX.x());
});
変更される可能性のある変数を作成するときは、それをオブザーバブルとして作成する必要があります。オブザーバブルは、実際には呼び出す関数です。呼び出されると、その内部値が更新され、オブザーバブルが「観察」されている場所であればどこでも変更がトリガーされます。
決してやろうとすべきではありませんthis.x = 5
。実際の監視可能なオブジェクトをオーバーライドするため、変更のすべてのオブザーバーをトリガーすることはありません。
編集
計算がどのように機能するかを理解することに興味がある場合。計算された変数は、listen
オブザーバブルを処理する関数です。が作成されると、そのcomputed
中からどのオブザーバブルが呼び出されたかを確認するために一度呼び出されます。これは、依存関係を「追跡」する方法です。この例では、少なくとも 2 つのコンソール ログが表示されます。1 で 1 つ、次に 5 で。
私の場合、計算された変数はどこにも影響を受けないため、匿名のようなものです。また、場合によっては、1 つの変数を監視する必要がありますが、複数の監視対象を使用する必要があります。他の使用済みオブザーバブルの更新を防ぐため。それにはいくつかの方法があります。必要なオブザーバブルを「見た」後に戻ることができます。
または、で計算された少し後にトリガーされるサブ関数を作成できますsetTimeout(..., 0);
。本当に素晴らしいトリックを実現するには、いくつかの方法があります。