1. ホーム
  2. knockout.js

[解決済み] 計算されたプロパティ関数を強制的に実行させる

2023-07-18 10:25:27

質問

計算されたプロパティがある場合

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

は、getCurrentValues()がコードの他の場所で修正されたobservableの異なるセットを返すことができると仮定します(そしてobservableArrayより複雑な構造から来ます)。

私が必要とするのは checkedValueCount が更新されるたびに

  • 依存関係に変更があった場合
  • getCurrentValues() は異なる観測値のセットを返します。

問題は ko.computed は最後に返された値を記憶し、依存関係が更新されたときだけ更新するようです。これは、最初のケースを処理しますが、後者のケースは処理しません。

私が探しているのは、checkedValueCountを再実行することを強制する方法です。私が使用できる何かです。

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

最も簡単に言うと、私が持っている

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

を強制的に呼び出すにはどうしたらよいでしょうか? a() を二回実行させ、異なる値を返させることができます。

どのように解決するのですか?

私の最初の回答は、あなたのポイントを見逃し、あなたの問題を解決しないことに気づきました。

問題は、computedは再評価を強制するobservableがある場合にのみ再評価されることです。computed を再評価するように強制するネイティブな方法はありません。

しかし、ダミーのobservable値を作成し、それが変更されたことをサブスクライバーに伝えることで、いくつかのハッキングでこれを回避することができます。

(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());

}());​

フィドルはこちら この方法を示す