【问题标题】:Is it possible to have a reactive isVerified call for Meteor users?是否可以对 Meteor 用户进行响应式 isVerified 调用?
【发布时间】:2014-07-02 23:19:04
【问题描述】:

使用 Meteor Accounts 包,每个用户的电子邮件都有verified 的属性。我想从客户端检查这一点并反应性地更新 dom。简而言之,我有一个模板,其中列出了属于某个组的所有用户,我想标记那些已回复发送给他们的 sendVerification() 电子邮件的用户。

想象一下:

<template name="users">
  {{#each allusers}}
    {{> user}}
  {{/each}}
</template>

<template name="user">
  <span>{{name}}</span>
  <span class="{{isVerified}}">Verified</span?
</template>

与:

Template.user.helpers({
  isVerified: function(){
    var user = this;
    // return true if this user is verified (has replied to verification email)
    Meteor.call('checkVerification', user, function(err, verified){
      if (verified) return 'active';
      else return '';
    });
  }
});

上面的帮助器的问题是 Meteor.call 不是响应式的,因此在我得到响应之前模板已经呈现。另一个问题是 Meteor.users 集合仅(或应该)在服务器上可用,我不能让客户端订阅整个集合。

那么,除了在我收到响应时使用 jquery 重绘 dom 之外,还有没有一种很好的方法可以将它们连接在一起以创建一个有用的 isVerified() 函数?

【问题讨论】:

  • 提供“用户”模板的this 的助手在哪里?只是认为您的用户信息已经来自服务器,显而易见的事情就是在那时设置一个“isVerified”字段。
  • @user728291 我有同样的想法,但问题是 allUsers 正在从存储在单独的 Group 对象中的数组中读取。我要么必须在该对象中维护一个单独的 verified 属性,这并不理想,要么在发布语句中检查每个用户的状态 - 这似乎很昂贵。
  • “昂贵”是一个相对术语。任何一种方法都需要相同的数据。您只是在客户端和服务器之间创建额外的流量,并将单个数据库调用拆分为多个。一次发布也更容易遵循代码。

标签: javascript meteor


【解决方案1】:

当你收到回调时更新一个 Session 值。

Template.user.isVerified = function(){
  return Session.get("verified");
}

function checkVerified() {
  var user = this;
  // return true if this user is verified (has replied to verification email)
  Meteor.call('checkVerification', user, function(err, verified){
    if (verified) Session.set("verified", true);
  });
}

然后,您可以随时致电checkVerified。我建议不要在模板助手中这样做,因为每次模板呈现和执行助手时,您都会访问服务器,但在您的代码中发生动作的地方。例如,在用户完成注册后。或者当他们下次加载页面时。等等

【讨论】:

  • 但这不是意味着我需要为每个用户(或至少每个组的每个成员)创建一个会话变量吗?我应该清楚,我不是在谈论当前登录的用户,而是所有这些用户。我想我可以通过电子邮件键入会话变量,但这感觉不是使用会话的正确方式。
  • 在这种情况下,您可能应该在服务器中的用户记录上设置.isVerified 属性,并确保将信息发布到客户端。如果您随后在模板中使用它,Meteor 将确保响应式重新渲染模板。
  • 是的,当然。我可以将属于该组的所有用户发布到客户端并过滤发布功能,使其仅返回电子邮件和经过验证的标志。安全高效。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多