定义时,反应变量未定义

时间:2015-07-23 01:48:07

标签: javascript meteor

我想帮助调试一个未定义Reactive Variable的情况,当它已经被定义时。

此代码将Reactive Variable附加到模板实例,并使用template.autorun()中的变量。

Template.home.onCreated(function () {
  this.limit = new ReactiveVar(15);

  this.autorun(function () {
    this.subscribe('recent-topics', this.limit.get());
  });
});

当我第一次加载模板时,我希望模板使用参数recent-topics订阅15。但是,代码会抛出错误:

Uncaught TypeError: Cannot read property 'get' of undefined

任何想法为什么?

3 个答案:

答案 0 :(得分:3)

只是为了传播ES6的乐趣而回答:

Template.home.onCreated(function () {
  this.limit = new ReactiveVar(15);

  this.autorun(() => {
    this.subscribe('recent-topics', this.limit.get());
  });
});

确保添加grigio:babel包,您的Javascript文件以.es6.js.es6.jsx结尾。

说明

在ES6(又名ECMAScript 6)中,有一个新的"胖箭头"语法与CoffeeScript的实现非常相似。在ES6中,当你做这样的事情时:

someFunc = function () {
  anotherThing((var1, var2) => {
    this.thing = true;
  });
};

与此相同:

someFunc = function () {
  var self = this;

  anotherThing(function (var1, var2) {
    self.thing = true;
  });
};

答案 1 :(得分:2)

这是一个范围问题。

在Tracker.autorun内部,这不再引用模板,而是引用自动运行的回调函数。在自动运行内部,尝试调用Template.instance()。limit.get()。

答案 2 :(得分:2)

比使用Template.instance().limit.get()(ryan的答案)更好

你应该这样做:

Template.home.onCreated(function () {
  var self = this;
  self.limit = new ReactiveVar(15);

  self.autorun(function () {
    self.subscribe('recent-topics', self.limit.get());
  });
});