計算プロパティ関数を強制的に実行する 質問する

計算プロパティ関数を強制的に実行する 質問する

計算されたプロパティが与えられた場合

vm.checkedValueCount = ko.computed(function(){
  var observables = getCurrentValues();  //an array of ko.observable[]
  return _.filter(observables, function(v) { return v() }).length;
});

getCurrentValues() が、コード内の他の場所で変更された (observableArray よりも複雑な構造から取得される) さまざまな observable セットを返すことができるとします。

checkedValueCountいつでも更新する必要がある

  • 依存関係の1つが変更される
  • getCurrentValues() は、異なる観測可能なセットを返します。

問題は、ko.computed最後に返された値をメモ化し、依存関係が更新された場合にのみ更新するように見えることです。これは最初のケースを処理しますが、後者のケースは処理しません。

私が探しているのは、checkedValueCount を強制的に再実行する方法。次のようなものが使えます:

changeCurrentValues();
vm.checkeValueCount.recalculate();

簡単に言えば、私が

a = ko.computed(function() { return Math.random() })

強制的にa()2 回呼び出して異なる値を返すにはどうすればよいですか。

ベストアンサー1

私の最初の回答はあなたの要点を理解しておらず、問題を解決できないことに気付きました。

問題は、計算されたものが再評価されるのは、再評価を強制する観測可能なものがある場合のみであるということです。計算されたものを強制的に再評価するネイティブな方法はありません。

ただし、ダミーの観測可能な値を作成し、そのサブスクライバーに変更があったことを通知することで、ハッキングによってこれを回避できます。

(function() {

    var vm = function() {
        var $this = this;

        $this.dummy = ko.observable();

        $this.curDate = ko.computed(function() {
            $this.dummy();
            return new Date();
        });

        $this.recalcCurDate = function() {
            $this.dummy.notifySubscribers();
        };        
    };

    ko.applyBindings(new vm());

}());​

フィドルはこちらこのアプローチを示す

おすすめ記事