最近、私が現在取り組んでいるプロジェクトでかなり奇妙なコードに出くわしました。この問題を示す孤立した例を次に示します。
<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 ウィジェットを再描画するために使用されます。だから私の質問は:
- これは最終的に修正されるノックアウトのバグですか? (更新後に機能しなくなる前に、この魔法を削除したほうがよいでしょう)
- これはある種の一般的なパターンであり、使用しても問題ありませんか?
更新:私が維持する必要があるプロジェクトで遭遇した実際のケースでは、従属オブザーバブルへの直接参照のないアラートの代わりに数行のコードがあり、オブザーバブルの値は、計算内から行われたネストされた関数呼び出しで変更されます。与えられた例は非常に単純化されています。また、両方の計算されたオブザーバブルは、おそらく最初に計算する唯一の目的であるスロットルエクステンダーで装飾されています。