【问题标题】:Template helper gets called multiple times模板助手被多次调用
【发布时间】:2015-11-23 19:18:56
【问题描述】:

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

在 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 逻辑不是我的强项)。

我的一个想法:用 Iron-router 实现整个想法是否会更简单?自动取款机。我想创建一个“单页应用程序” - 因此我认为我不需要路由器。

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

【问题讨论】:

    标签: javascript mongodb meteor meteor-helper


    【解决方案1】:

    模板助手可以被多次调用,因此最好避免使它们成为有状态的。您最好在 onCreatedonRendered 中选择随机条目 template handler. 在那里您可以进行随机选择、更新状态并将您的选择放入 Session由助手检索的变量。

    【讨论】:

    • 谢谢,现在的问题是,它可以工作(它只被调用一次)但逻辑不知何故不适用 - 整个“当前用户不在用户数组中”部分不知何故不起作用?例如我多次得到一个句子(即使在现在的 onRendered 中它应该创建一个新的结果集,其中包含该用户未见过的句子。
    • 您没有显示从一个句子移动到另一个句子的代码或将句子更新为已读的位置。
    • 这就是我想要做的。我更新了问题。
    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 2014-01-30
    • 2016-05-26
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2015-01-06
    相关资源
    最近更新 更多