【发布时间】:2015-04-25 01:59:20
【问题描述】:
最近,我在当前正在处理的项目中遇到了相当奇怪的代码。这是描述该问题的孤立示例:
<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>
anonymous 计算的 observable 中的警报不仅会在创建 viewModel 时触发,而且每次都会触发依赖的 observable(在本例中为 lastName)在构造函数完成之后。在我现在维护的代码中,这用于运行特定代码以重绘绑定的 ui 小部件。 所以我的问题是:
- 这是最终修复的淘汰赛中的错误吗? (所以我最好在更新后停止工作之前移除这个魔法)
- 这是一种常见的模式并且完全可以使用吗?
更新: 在我在项目中遇到的实际情况中,我需要维护有几行代码来代替 alert,并且没有直接引用依赖的 observable,observable 的值在从计算内部进行的一些嵌套函数调用中发生了变化。给出的示例非常简化。此外,两个计算的 observables 都装饰有油门扩展器,这可能是让它们首先被计算的唯一目的。
【问题讨论】:
-
你为什么首先创建
computed? -
您到底希望发生什么?这不是一个错误……这正是计算出的 observable 应该如何工作的。该值是在创建时计算的,并在它所依赖的其他 observables 更新时更新。
-
我希望 anonymous 计算的 observable 在声明时只执行一次。由于无法读取它的值,因此不再执行它。我希望它在一定程度上类似于pure computed 行为。没有名字 > 没有订阅者 > 没有执行。
-
您正在将计算的 observable 视为一个值。虽然可能是这样,但没有要求说明它必须这样做。也许将计算的视为回调函数会更容易。在匿名计算的情况下,它就像一个没有返回值的回调函数,而命名计算类似于一个返回值的回调函数。
标签: knockout.js anonymous computed-observable