3

我想创建一个类似于下面的模板/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,实际上它是相同的模板,一个调用就足够了。

有任何想法吗?

4

3 回答 3

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

这是我尝试过的另一个示例,它适用于当前的 master 和 devel 分支:

<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"
    };
  };
}
于 2012-07-08T21:57:14.157 回答
0

汤姆的回答是正确的。我想插话并补充说,在我的场景中,#with 失败的原因是由于流星的“反应性”性质,我第一次调用加载模型导致“未定义”并且我没有检查它. 一小部分后加载正常。道德是做类似的事情

var record = Record.findOne({whatever:value})
if (record) {
  return record;
} else {
  // whatever
  return "loading"
}
于 2012-07-11T19:33:35.543 回答
0

您希望避免两个功能的任何具体原因?

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

{{> item}}

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

<template name="item"> 

似乎为第一个和第二个提供辅助功能很简单。尽管我还没有让它与我自己的代码一起使用,但我相信第二个辅助函数会希望使用“this”约定来引用您所指的集合。

欢呼——呼喊

于 2012-07-11T00:21:48.230 回答