用户更新时,currentUser中包含的内容会重新呈现

时间:2013-02-09 01:05:24

标签: meteor

我正在使用Meteor并遇到一个问题,即在我不想要的时候重新呈现我的内容。

我的主要内容包含在currentUser if语句中,我觉得这是相当标准的。

{{#if currentUser}}
  {{> content}}
{{/if}}

这个问题是我更新用户对象时正在重新呈现我的内容模板。有没有办法解决?我不会在内容模板中的任何位置引用用户。

谢谢!

这是一个用于复制我的问题的示例应用:

HTML

<head>
  <title>Render Test</title>
</head>

<body>
  {{loginButtons}}

  {{> userUpdate}}

  {{#if currentUser}}
    {{> content}}
  {{/if}}
</body>

<template name="userUpdate">
  <p>
    <input id="updateUser" type="button" value="Update User Value" />
    User last update: <span id="lastUpdated">{{lastUpdated}}</span>
  </p>
</template>

<template name="content">
  <p>Render count: <span id="renderCount"></span></p>
</template>

的JavaScript

if (Meteor.isClient) {
  Meteor.startup(function() {
    Session.set("contentRenderedCount", 0);
  });

  Template.content.rendered = function() {
    var renderCount = Session.get("contentRenderedCount") + 1;
    Session.set("contentRenderedCount", renderCount);
    document.getElementById("renderCount").innerText = renderCount;
  };

  Template.userUpdate.events = {
    "click #updateUser": function() {
      Meteor.users.update({_id: Meteor.userId()}, {$set: {lastActive: new Date()}});
    }
  };

  Template.userUpdate.lastUpdated = function() {
    return Meteor.user().lastActive;
  };

}

if (Meteor.isServer) {
  Meteor.users.allow({
    'update': function () {
      return true; 
    }
  });
}

更新 我应该稍微解释一下这个例子。创建用户后,单击“更新用户值”按钮会使渲染计数增加。这是因为它包含在{{#if currentUser}}中。如果删除了if,您会注意到渲染计数保持为1。

此外,您还需要将accounts-uiaccounts-password个包添加到您的项目中。

1 个答案:

答案 0 :(得分:8)

Meteor将重新渲染包含已更改的反应变量的任何模板。在您的情况下,{{currentUser}}Meteor.user(),它是包含用户数据的对象。当您更新用户配置文件时,对象会发生变化,并告诉meteor重新计算涉及该对象的所有反应。

我们可以稍微改变一下反应,这样它只会对用户是否登录/退出而不是对象本身内的任何内容的变化作出反应:

Meteor.autorun(function() {
    Session.set("meteor_loggedin",!!Meteor.user());
});

Handlebars.registerHelper('session',function(input){
    return Session.get(input);
});

你的HTML

{{#if session "meteor_loggedin"}}
    {{> content}}
{{/if}}