1

我正在阅读跟踪器手册并且很难理解某些内容。

我知道这dependency.changed()将使依赖项中的所有计算无效,导致跟踪器重新运行。

但是为什么 Meteor 在失效时会从依赖中删除计算呢?

例如,这是手册中的 Tracker 示例:

Dependency.prototype.depend = function () {
  var self = this;
  if (Tracker.currentComputation) {
    var id = self._nextId++;
    self._dependents[id] = Tracker.currentComputation;
    Tracker.currentComputation.onInvalidate(function () { # Here
      delete self._dependents[id];                        # Here
    });                                                   # Here
  }
};

Dependency.prototype.changed = function () {
  for (var id in this._dependents) {
    this._dependents[id].invalidate();
  }
};

为什么我们要添加Tracker.currentComputation.onInvalidate()回调以从依赖项中删除计算?对我来说似乎没有必要。

我想完全理解这一点。有任何想法吗?

4

1 回答 1

0

请考虑这个 Tracker.autorun 功能:

Tracker.autorun(()=>{
    if(dependency1.get()>10){
        console.log(dependency2.get());
    }
});

这很简单,dependency2只要dependency1高于 10,它就会记录所有更改。现在,如果在计算dependency1中低于 11,它将只依赖于它。而如果计算在dependency1高于 10 时运行,它将取决于两个依赖项。

如果您不删除依赖项并且dependency1等于或低于 10,则跟踪器仍将在每次dependency2更改时运行,尽管不会发生任何事情。这可能成为大型自动运行的真正性能问题。

于 2016-10-04T11:41:56.310 回答