You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Meteor+Blaze:在Promise回调中访问模板ReactiveVar的问题

如何在Promise回调和充电状态变化事件中访问Meteor模板的ReactiveVar?

这个问题的核心是回调函数中this的指向问题——在Promise的then回调和chargingchange事件监听器里,默认的this已经不再指向你的模板实例了,所以直接用this.isBatteryCharing会报错。下面给你两种简单有效的解决方法:

方法1:提前保存模板实例的引用

在onCreated函数开头,把模板实例(也就是当前的this)存到一个变量里,之后所有回调都用这个变量来访问ReactiveVar:

Template.Sidebar.onCreated(function(){
  // 保存模板实例的引用
  const templateInstance = this;
  templateInstance.isBatteryCharing = new ReactiveVar(false);

  navigator.getBattery().then(function(battery) {
    // 初始化设置当前充电状态(避免页面加载后无初始值)
    templateInstance.isBatteryCharing.set(battery.charging);

    battery.addEventListener('chargingchange', function(){
      // 用提前保存的模板实例变量访问ReactiveVar
      templateInstance.isBatteryCharing.set(battery.charging);
    });
  });
});

方法2:使用箭头函数(ES6+)

箭头函数不会绑定自己的this,它会继承外层作用域的this(也就是模板实例),这样就能直接在回调里用this访问ReactiveVar了:

Template.Sidebar.onCreated(function(){
  this.isBatteryCharing = new ReactiveVar(false);

  navigator.getBattery().then((battery) => {
    // 初始化设置当前充电状态
    this.isBatteryCharing.set(battery.charging);

    battery.addEventListener('chargingchange', () => {
      // 箭头函数继承了外层的this(模板实例)
      this.isBatteryCharing.set(battery.charging);
    });
  });
});

小提示

我把你的ReactiveVar初始值从0改成了false,因为battery.charging本身是布尔值,这样类型匹配更合理;如果你的业务逻辑确实需要数字初始值,改回0即可。另外别忘了初始化时设置一次当前充电状态,不然页面加载后ReactiveVar会一直停留在初始值,直到第一次充电状态变化才更新。

内容的提问来源于stack exchange,提问作者Ankur Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:03:21