模板助手被多次调用

时间:2015-08-29 04:35:07

标签: javascript mongodb meteor meteor-helper

我的目的是从集合中检索一个随机条目并将其显示在网站上 - 如果所有句子都通过(读取:用户已“看到”它们),则显示其他内容(因此返回虚拟句子)。但是,在服务器启动和按钮单击事件上,此助手至少会被触发两次。这是一些代码:

在client.js中:

Template.registerHelper('random_sentence', function() {
  fetched = _.shuffle(Sentences.find({
    users: {
      $nin: [this.userId]
    }
  }).fetch())[0];
  if (fetched === undefined) {
    return {
      sentence: "done",
      _id: 0,
      done: true
    };
  }
  Session.set('question', fetched._id);
  console.log(fetched);
  return fetched;
  });

模板的辅助函数:

sent: function(){
  sent = Session.get('question');
  return Sentences.findOne(sent);
}

在主模板中:

{{#with random_sentence}}
  {{#if done}}
    <!-- Display something else -->
  {{else}}
    <div class="container">
      {{> question}}
    </div>
  {{/if}}
{{/with}}

“问题”模板:

<div class="well">
  <div class="panel-body text-center">
    <h3>{{sent.sentence}}</h3>
  </div>
</div>

如果我没有在“random_sentences”函数中返回任何内容,则不会显示任何内容。

我不知道我的“逻辑失败”在哪里?我是流星的新手 - 所以我可能会忽略一些明显的东西。

提前致谢: - )

更新:这就是我打算获取新句子并显示它的方式:

Template.answer.events({
  'click': function(event) {
    var text = event.target.getAttribute('id');
    if (text !== null) {
      var question = Session.get('question');
      var setModifier = {
        $inc: {}
      };
    setModifier.$inc[text] = 1;
    Sentences.update(question, setModifier);
    Meteor.call('update_user', question);
    Notifications.success('Danke!', 'Deine Beurteilung wurde gespeichert.');
    Blaze.render(Template.question, document.head);
    }
  }
});

在server.js中(更新问题和用户的计数器):

Meteor.methods({
  update_user: function(question) {
    Sentences.update(question, {
      $push: {
        "users": this.userId
      }
    });
    Meteor.users.update({
      _id: this.userId
    }, {
      $inc: {
        "profile.counter": 1
      }
    });
  },
});

我在网络上找到了Blaze.render功能。 “document.head”部分只是因为这个函数需要一个DOM元素来渲染,而且因为document.body只是“倍增”了身体,所以我把它移到了头部。 (DOM逻辑不是我的强项)。

我有一个想法:它会使整个想法更简单地用铁路由器实现吗?大气压。我想创建一个“单页应用程序” - 因此我认为我不需要路由器。

另一个问题:让这个逻辑起作用(用户获得一个他没有看到的随机句子)并发布小集合(因此客户端在使用之前不必下载5 MB数据)。 / p>

1 个答案:

答案 0 :(得分:0)

模板助手可以多次调用,因此最好避免使它们成为有状态。你最好选择 onCreated onRendered template handler.中的随机条目。你可以随意选择,更新状态,然后选择一个由助手检索的Session变量。