流星独特的文档领域?

时间:2015-04-16 13:59:08

标签: javascript meteor

我正在尝试构建一个学习应用程序,目前需要从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个相同的副本发布这是我想避免的。

1 个答案:

答案 0 :(得分: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将重新运行,并使用新数据重新计算结果。