0

特定のオブジェクト (サブクラスではなく) の関数をオーバーライドするかどうかを検討してください。

var Animal = function() {
  var self = this;

  self.hello = ko.computed(function() {
    return 'Not implemented hello';
  });

  self.greeting = ko.computed(function() {
    return self.hello() + '!!';
  });
};

var dog = new Animal();
dog.hello = ko.computed(function() {
  return 'Wooff';
});
console.log(dog.greeting());

出力は次のようになると予想していました。Wooff!!

しかし、それは:Not implemented hello!!

これは、機能するプレーンな JavaScript と機能しないノックアウトで実装した jsbin です: http://jsbin.com/uyilot/1/edit

**編集**

Ryan のソリューションを使用した jsbin (現在動作中!): http://jsbin.com/uyilot/2/edit

4

2 に答える 2

7

問題は、ko.computedデフォルトでは、 a が作成されるとすぐに評価されることです。依存関係の 1 つが変更された場合にのみ再評価されます。greetingあなたのシナリオでは、再評価の原因となる更新中の依存関係はありません。

1 つの選択肢は、deferEvaluationフラグを使用して、最初にアクセスされるまで計算結果が評価されないようにすることです。次のようになります。

self.greeting = ko.computed({
    read: function() {
        return self.hello() + '!!';
    },
    deferEvaluation: true
});

それ以外の場合、greeting特定のオブザーバブルに依存し、そのオブザーバブルが更新された場合、それも再評価されます。

于 2013-07-16T13:27:44.477 に答える
0

の依存関係は が最初に評価されたko.computedときにのみ記録されるため、これは奇妙なシナリオです。が初めて評価されるとき、Knockout は を参照します。の参照を別の計算変数に変更しても、依存関係は更新されません。computedgreetingself.helloself.hello

この問題を解決するには、self.helloそれ自体を次のようにしobservableます。

self.hello = ko.observable(ko.computed(function() {
    return 'Not implemented hello';
}));

では、次のようself.greetingに参照します。self.hello

self.greeting = ko.computed(function() {
    return self.hello()() + '!!';
});

を更新する必要がある場合はself.hello、次のことができます。

dog.hello(ko.computed(function() {
  return 'Wooff';
}));

また、参考のために JSBin に変更した例をまとめました: http://jsbin.com/ogajaw/1/edit

結局のところ、これは奇妙な例です。しかし、それは機能します。

于 2013-07-16T13:45:44.540 に答える