【问题标题】:Randomly occurs with Meteor: "TypeError: Cannot read property 'invalidate' of undefined"Meteor 随机发生:“TypeError:无法读取未定义的属性‘无效’”
【发布时间】:2015-07-24 11:08:01
【问题描述】:

在看似随机的情况下,当我网站上的用户尝试回答测验页面上的问题时,会出现以下错误:

TypeError: Cannot read property 'invalidate' of undefined
at Tracker.Dependency.changed (tracker.js:388)
at ReactiveVar.set (reactive-var.js:82)
at null. (builtins.js:22)
at view.js:191
at Function.Template._withTemplateInstanceFunc (template.js:437)
at view.js:190
at Object.Blaze._withCurrentView (view.js:523)
at viewAutorun (view.js:189)
at Tracker.Computation._compute (tracker.js:294)
at Tracker.Computation._recompute (tracker.js:313)

我不确定为什么会发生这种情况,我也不完全确定这个错误何时意味着,所以如果有人能指出我正确的方向,那就太好了!

注意:这个错误似乎只在使用 Chrome 时出现。

【问题讨论】:

  • 使用给定的堆栈跟踪找到问题的根源。由于我们没有来自所有这些文件的 src,因此我们无能为力。

标签: meteor


【解决方案1】:

我冒险猜测一下,这是Tracker.Dependency中的罪魁祸首代码

Tracker.Dependency.prototype.changed = function () {
  var self = this;
  for (var id in self._dependentsById)
    // My Comment - we're expecting this to be a `Tracker.Computation` which has an `.invalidate()` method!
    self._dependentsById[id].invalidate();
};

所以,问题在于 某事 正在修改 Object.prototype

例如。

Object.prototype.test = function(){}
var emptyObj = {}; 
for (i in emptyObj) 
  console.log('has key=', i, 'isOwnProperty?=', emptyObj.hasOwnProperty(i))

将打印出来:

has key= test isOwnProperty?= false

尝试的一种可能的解决方案是将这个片段添加到客户端,并查看它是否解决了问题(至少暂时):

Tracker.Dependency.prototype.changed = function () {
  var self = this;
  for (var id in self._dependentsById){
    if (self._dependentsById.hasOwnProperty(id)){
      self._dependentsById[id].invalidate();
    }
  }
};
Tracker.Dependency.prototype.hasDependents = function () {
  var self = this;
  for(var id in self._dependentsById)
    if (self._dependentsById.hasOwnProperty(id))
      return true;
  return false;
};

但是 - 添加到 Object.prototype 是一种不好的做法,并且很多代码会以意想不到的方式失败。您需要对此进行追踪。

【讨论】:

    【解决方案2】:

    没有更多信息很难说,但我会在这里看看,特别是“订阅不阻止”下的部分:

    https://dweldon.silvrback.com/common-mistakes

    正如作者所说,“在流星中,大多数“无法读取未定义的属性”错误是由对订阅数据存在的错误假设引起的。”

    换句话说,您可能试图在订阅返回任何内容之前访问 invalidate 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 2018-03-02
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2017-06-20
      相关资源
      最近更新 更多