【问题标题】:Where can I store a JSON document so that it can be accessed from a template helper multiple times?我在哪里可以存储 JSON 文档,以便可以从模板助手多次访问它?
【发布时间】:2017-05-01 08:17:06
【问题描述】:

在我的代码中,我试图访问一个存储书籍信息的集合。我正在循环一个只存储每本书 ID 的数组。然后我使用该 ID 从名为 Books 的集合中查询这本书,该集合存储每本书的完整信息

Template.myBorrows.helpers({
  storeInSession:function(ilendbooksId) {
    console.log("storeInSession is called");
    var currentBorrowBook = Books.findOne({_id: ilendbooksId});
    Session.setAuth('currentBorrowBook' , currentBorrowBook);
  },

  getAuthor: function() {
    var currentBorrowBook = Session.get('currentBorrowBook');
    return currentBorrowBook.ItemAttributes[0].Author[0];
  },
});

我正在通过 Books 集合中图书的 _id 查询图书文档。然后我将它存储在一个会话中,然后调用适当的方法来获取信息。唯一的问题是我必须为一系列书籍执行此操作,因此每次 Session 中的前一个文档被覆盖并且我页面上的所有数据都更改为最新的 Session 文档。如何以及在哪里存储每本书的文档并确保显示正确的信息而不更新到最新的 Session 文档?

【问题讨论】:

  • 你让你的生活变得不必要的复杂。您是否为 Meteor 做过任何基于 blaze 的教程?您不应该在帮助程序中设置会话变量 - 而是在事件处理程序中进行。如果您要遍历一系列书籍,则不需要为每一本书调用方法,您还可以直接在模板中访问每本书的属性,甚至不需要帮助程序。
  • 对不起,我应该更清楚。如果我正在遍历一个存储了关于每本书的足够信息的集合,是的,我可以访问每个属性。我实际上循环了一个只存储每本书 ID 的数组。然后我使用该 ID 从名为 Books 的集合中查询这本书,该集合存储每本书的完整信息。

标签: meteor meteor-blaze


【解决方案1】:

为了回答您的评论,您有一个文档数组_ids,并且您想在模板中获取该文档。

html:

<template name="myTemplate">
{{#each array}}
  {{#with doc}}
    Author: {{author}}
  {{/with}}
{{/each}}
</template>

js:

Template.myTemplate.helpers({
  array(){ return theArrayOfIdsThatYouveDefined; },
  doc(){ return Books.findOne(this); }
});

{{#each array}} 循环内this 将是数组的一个元素。 doc 助手只是从Books 集合中查找一本书并返回它。现在在{{#with doc}} 块内,数据上下文将是一个书籍对象。

不需要会话变量或方法调用。

【讨论】: