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>

匿名计算 observable中的警报不仅会在创建 viewModel 时触发,而且还会在构造函数完成每次更改依赖的 observable(在本例中为 lastName)时触发。在我现在维护的代码中,这用于运行特定代码以重绘绑定的 ui 小部件。所以我的问题是:

  1. 这是淘汰赛中的一个错误,最终会被修复吗?(所以我最好在更新后停止工作之前删除这个魔法)
  2. 这是一种常见的模式并且完全可以使用吗?

更新:在我在项目中遇到的实际情况中,我需要维护有几行代码来代替警报,并且没有直接引用依赖的可观察对象,可观察对象的值在从计算内部进行的一些嵌套函数调用中发生了更改。给出的示例非常简化。此外,两个计算的 observables 都装饰有油门扩展器,这可能是让它们首先被计算的唯一目的。

4

2 回答 2

1

当一个函数(包括computed函数)正在读取某个 observable 的值时,Knockout 会自动在两者之间创建依赖关系。一旦可观察值发生变化,将重新评估所有相关函数。

但是,您可以使用以下方法显式指示 Knockout不要创建依赖项peek()

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

请参阅“依赖项跟踪的工作原理”

于 2015-02-24T08:49:06.780 回答
0

当然,每次当函数内部使用的任何 observable 的值发生变化时,计算函数都会调用。

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

于 2015-02-23T18:43:34.657 回答