我想帮助调试一个未定义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
任何想法为什么?
答案 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());
});
});