【问题标题】:Meteor unique document field?Meteor 独特的文档字段?
【发布时间】:2015-04-16 23:21:43
【问题描述】:

我正在尝试构建一个学习应用程序,目前它需要从 subreddit 获取前 7 个帖子,然后如果数据库中还没有这些帖子,则将其添加到数据库中。然而,由于某种原因,它同时运行 if 和 else 7 次,我不知道为什么。这是辅助方法:

Template.posts.helpers({
  posts : function () {
    Meteor.call('getPosts', "tifu", function(e, results){
      var result = JSON.parse(results.content).data.children;
      Session.set('postsResults', result);
    });
    for(var i=0; i<7; i++){
      var result = Session.get('postsResults')[i].data;
      if(Posts.find({r_id: result.id}).count() == 0){
        console.log("if");
      } else {          
        console.log("else");
      };
    };
    return Posts.find();
  }
});

和 html 方面:

<template name="posts">
    <div class="col-md-12 posts-div">
      {{#each posts }}
        <div class="col-md-8">
          <div class="panel panel-primary">
            <div class="panel-heading">
              <h3 class="panel-title">{{ title }}</h3>
            </div>
            <div class="panel-body">{{{ body }}}</div>
            <div class="panel-footer">
              <div class="col-md-2">{{ score }}</div>
              <div class="col-md-2 col-md-offset-3">{{ subreddit }}</div>
              <div class="col-md-2 col-md-offset-3">{{ createdBy }}</div>
              <div class="clearfix"></div>
            </div>
          </div>
        </div>
        <div class="col-md-4">
          <div class="panel panel-primary">
          </div>
        </div>
      {{/each}}
    </div>
    <hr>
</template>

我已经用简单的控制台日志替换了插入代码,这些是我得到的结果:

if
if
if
if
if
if
if
else
else
else
else
else
else
else

当我在控制台中运行Posts.find({r_id: result.id}).count() == 0 时,我得到与Posts.findOne({r_id: result.id}) == null 相同的错误,但由于某种原因,在javascript 文件中它仍然运行真实部分,然后我最终得到了同一篇文章的50 个副本,这就是我尽量避免。

【问题讨论】:

  • 那是因为助手运行异步,所以首先 == 0 为真,然后另一个语句为真,这就是你在 if 语句中得到的其他控制台,例如 pine console.log(Posts.find({r_id: result.id}).count()),你会获取0 并在 1 秒内获取 lester 你会得到另一个号码。

标签: javascript meteor


【解决方案1】:

在帮助程序中使用Meteor.call 不是最佳选择。每次发生反应性更改时,助手的function 都会重新运行。这就是它运行这么多次的原因。

改用Template.onCreated 回调:

Template.posts.onCreated(function() {
    Meteor.call('getPosts', "tifu", function(e, results){
        var result = JSON.parse(results.content).data.children;
        Session.set('postsResults', result);
    });
});

还有你的助手:

Template.posts.helpers({
  posts : function () {
    var r = Session.get('postsResults')

    for(var i=0; i<7; i++){
        if(!r) continue;
        var result = r[i].data;
        if(Posts.find({r_id: result.id}).count() == 0){
          console.log("if");
        } else {          
          console.log("else");
        };
      };
    return Posts.find();
  }
});

要记住的第二件事是Session.get('postsResults') null,而Meteor.call 的结果会在几百毫秒内返回。如果你这样做 Session.get('postsResults')[i].data 你会得到一个例外。

这就是为什么我添加了一个条件检查以在r 为空时继续循环。这样您就可以等待结果,posts function 将重新运行并使用新数据重新计算结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2015-08-05
    • 1970-01-01
    • 2018-12-22
    • 2014-11-14
    • 2014-08-31
    • 2012-06-28
    相关资源
    最近更新 更多