knockout.js 3.3.0でcomputedな値を強制的に変更通知する

小ネタ。

knockoutでcomputedなオブジェクトが吐き出す値が変更されたことを強制的に変更通知するには、valueHasMutated()を呼べばいいよ、という事があちこちに良く書いてあります。

しかし、これは最新版の3.3ではなくなっています。(knockoutはバージョンアップの度に気軽ににズバズバと関数を落として言っている印象があります)で、notifySubscribersというそれっぽい関数が別途追加されました。しかしどう使っていいかイマイチ分かりません…。というか、これ、ドキュメントに書いてるかあ?っつうか、公式のドキュメント古くないかあ?pureComputedの話とか書いてるし。

そもそも、computedの依存関係はどのように構築しているのでしょうか。

How dependency tracking works

上記を読むとcomputedは生成された段階で一度内部の式を評価して、その時に読みだした他のobservableなオブジェクトを調べ上げるという処理を行っているそうな。え、じゃあもしcomputedでif文を使って処理を分岐してると、初回評価時に分岐しなかった方の依存関係は判定されないってこと?えー、試したいけど試すほど暇でもないし、そこまでknockout好きじゃないんだ。僕。

ということは、逆に言えばダミーのobservableオブジェクトを用意して、それをcomputedの中で呼べば強制的に依存関係を作れるってこと…?と、おもって調べたらジャストそのままの回答を発見。

Knockout.js - Force a computed to run

つまり、こうすればいい。

this.dummy = ko.observable();
this.value1 = ko.computed({
 self.dummy();
 // ・・・・・・
});
this.value2 = ko.computed({
 self.dummy();
 // ・・・・・・
});

// 変更通知
this.dummy().notifySubscribers();

これでvalue1、value2のバインド先がちゃんと書き変わる。以上。