最近,我在我目前正在从事的项目中遇到了相当奇怪的代码。这是描述该问题的孤立示例:
<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>
匿名计算 observable中的警报不仅会在创建 viewModel 时触发,而且还会在构造函数完成后每次更改依赖的 observable(在本例中为 lastName)时触发。在我现在维护的代码中,这用于运行特定代码以重绘绑定的 ui 小部件。所以我的问题是:
- 这是淘汰赛中的一个错误,最终会被修复吗?(所以我最好在更新后停止工作之前删除这个魔法)
- 这是一种常见的模式并且完全可以使用吗?
更新:在我在项目中遇到的实际情况中,我需要维护有几行代码来代替警报,并且没有直接引用依赖的可观察对象,可观察对象的值在从计算内部进行的一些嵌套函数调用中发生了更改。给出的示例非常简化。此外,两个计算的 observables 都装饰有油门扩展器,这可能是让它们首先被计算的唯一目的。