Meteor:将多个值传递给模板

时间:2012-07-08 20:34:19

标签: meteor handlebars.js

我想创建一个类似于下面的模板/ js组合。我想要的是“集合”模板可以使用两个变量

<template name="collection">
  Title: {{title}}
  <UL>
  {{#each items}}
    {{> item}}
  {{/each}}
  </UL>
</template>

<template name="collection_items"> 
  <LI>{{item_title}}</LI>
</template>

javascript函数的位置如下:

Template.collection.data = function() {
  var record = Record.findOne({whatever:value});
  return { title: record.title, items: record.items }
}

我尝试过使用Handlebars的{{#with data}}帮助器并返回上面的对象,但这只是撞坏了模板。我尝试过创建一个“顶级”功能,如:

Template.collection = function () {... }

但这也使模板崩溃了。

我想避免的是有两个单独的函数(一个Template.collection.title和一个Template collection.items),其中每个函数都在Record集合上调用一个findOne,其中它实际上是相同的模板和一个调用应该足够了。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

Template.collection = function () {... }

Template.collection不是一个函数,它是一个实例,因此是一个对象。

您可以在控制台中输入Template.collection以查看必要的内容以及Template.collection.并自动填充以查看其方法和字段。


对于#with示例,Todos确实似乎没有包含您在评论中概述的那个。因此,可以在此处找到它的示例用法:

https://github.com/meteor/meteor/blob/master/packages/templating/templating_tests.js#L75 https://github.com/meteor/meteor/blob/master/packages/templating/templating_tests.html#L92

这是我尝试的另一个示例,它适用于当前的主分区和开发分支:

<head>
  <title>test</title>
</head>

<body>
  {{> hello}}
</body>

<template name="hello">
  {{#with author}}
  <h2>By {{firstName}} {{lastName}}</h2>
  {{/with}}
</template>

它的JS部分:

if (Meteor.is_client) {
  Template.hello.author = function () {
    return {
      firstName: "Charles",
      lastName: "Jolley"
    };
  };
}

答案 1 :(得分:0)

您希望避免两种功能的具体原因是什么?

从您的代码示例中我看到一个问题:第一个模板使用此行调用第二个模板:

{{> item}}

但是你的第二个模板不称为“项目”。我相信你的第二个模板应该这样称呼:

<template name="item"> 

似乎第一次和第二次都有简单的辅助函数。虽然我还没有使用自己的代码,但我相信第二个辅助函数会想要使用'this'约定来引用你所指的集合。

干杯 - 霍林

答案 2 :(得分:0)

汤姆的回答是正确的。我想简单介绍并在我的场景中添加#with失败的原因是因为由于流星的“反应”性质,我第一次加载模型的调用导致'undefined'而我没有检查它。一小段后,它加载好了。 道德是做

之类的事情
var record = Record.findOne({whatever:value})
if (record) {
  return record;
} else {
  // whatever
  return "loading"
}