1

最近、私が現在取り組んでいるプロジェクトでかなり奇妙なコードに出くわしました。この問題を示す孤立した例を次に示します。

<html lang="en-US">
<head>
  <meta charset="UTF-8">
</head>
<body>
    <input type="text" data-bind = "value: firstName">
    <input type="text" data-bind = "value: lastName">
  <br />  <br />
  <span data-bind = "text: firstName"></span>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
  <script>
    var myViewModelProto = function(){
    self = this;
    this.firstName = ko.observable("John");
    this.lastName = ko.observable("Smith");

    ko.computed(function(){
        alert(self.lastName());
    });
};

var vm = new myViewModelProto();
ko.applyBindings(vm);
</script>
</body>
</html>

匿名計算オブザーバブルのアラートは、viewModel が作成されたときだけでなく、コンストラクター関数の完了に依存オブザーバブル (この場合は lastName) が変更されるたびに発生します。私が現在維持しているコードでは、これは特定のコードを実行してバインドされた ui ウィジェットを再描画するために使用されます。だから私の質問は:

  1. これは最終的に修正されるノックアウトのバグですか? (更新後に機能しなくなる前に、この魔法を削除したほうがよいでしょう)
  2. これはある種の一般的なパターンであり、使用しても問題ありませんか?

更新:私が維持する必要があるプロジェクトで遭遇した実際のケースでは、従属オブザーバブルへの直接参照のないアラートの代わりに数行のコードがあり、オブザーバブルの値は、計算内から行われたネストされた関数呼び出しで変更されます。与えられた例は非常に単純化されています。また、両方の計算されたオブザーバブルは、おそらく最初に計算する唯一の目的であるスロットルエクステンダーで装飾されています。

4

2 に答える 2

1

関数 (関数を含むcomputed) が何らかのオブザーバブルの値を読み取っている場合、Knockoutは 2 つの間の依存関係を自動的に作成します。観察可能な値が変更されると、すべての依存関数が再評価されます。

ただし、次のメソッドを使用して、依存関係を作成しないようにKnockout に明示的に指示できます。peek()

ko.computed(function(){
    alert(self.lastName.peek());
});

「依存関係追跡の仕組み」を参照してください

于 2015-02-24T08:49:06.780 に答える
0

もちろん、計算された関数は、この関数内で使用されたオブザーバブルの値が変更されるたびに呼び出されます。

http://knockoutjs.com/documentation/computedObservables.html

于 2015-02-23T18:43:34.657 に答える