Javascript Meteor.js:如何避免使用点符号进行无用的刷新/计算/重新渲染

Javascript Meteor.js:如何避免使用点符号进行无用的刷新/计算/重新渲染,javascript,meteor,meteor-helper,Javascript,Meteor,Meteor Helper,我需要一种避免无用计算的方法; 在反应函数中,我有一个反应对象,我只需要一个属性,但如果该对象的另一个属性发生变化,则会重新计算所有函数: Template.registerHelper('name', function() { console.log("running"); return Meteor.user().profile.name; }); (以html格式) 你猜你在控制台中看到了什么(第二次…) 但是它应该只运行一次,因为名称没有更改 为什么它很重要?在我的应用

我需要一种避免无用计算的方法; 在反应函数中,我有一个反应对象,我只需要一个属性,但如果该对象的另一个属性发生变化,则会重新计算所有函数:

Template.registerHelper('name', function() {
    console.log("running");
    return Meteor.user().profile.name;
});
(以html格式)

你猜你在控制台中看到了什么(第二次…)

但是它应该只运行一次,因为名称没有更改


为什么它很重要?在我的应用程序中,我有复杂的计算,用户在线/空闲状态很容易改变

只要使用的反应函数的值发生变化,计算就会重新运行。在您的例子中,反应函数是
Meteor.user()
,所以只要该方法的结果发生变化,就会触发重新运行

要将重新运行限制在真正需要的位置,您需要使用(或创建)一个反应式函数,该函数将准确返回您要跟踪的值,仅此而已。例如:

var prop = new ReactiveVar();

Template.template.onRendered(function() {
  this.autorun(function() {
    prop.set(Meteor.user().profile.name);
  });
});

Template.template.helpers({
  hlpr: function() {
    console.log("RERUN!!!");
    return prop.get();
  },
});

一直这样做是一个好主意吗?因为我已经创建了一个函数来轻松地完成它,并且我将在一个包中发布它,以自我回答,非常感谢!我还了解到,在模板中使用反应对象数组确实是一个坏主意
Meteor.users.update({_id:Meteor.userId()},{$set:{"profile.age":20}});
running               x2
var prop = new ReactiveVar();

Template.template.onRendered(function() {
  this.autorun(function() {
    prop.set(Meteor.user().profile.name);
  });
});

Template.template.helpers({
  hlpr: function() {
    console.log("RERUN!!!");
    return prop.get();
  },
});