5

我正在使用 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}}. 如果将其删除,您会注意到渲染计数仍为 1。

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

4

1 回答 1

8

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

我们可以稍微改变一下反应性,让它只对用户是否登录/退出的变化做出反应,而不是对象本身的任何变化:

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}}    
于 2013-02-09T02:34:01.053 回答