【问题标题】:How Do I Properly Make a Meteor Template Reactive?我如何正确地使流星模板反应?
【发布时间】:2015-05-10 19:14:16
【问题描述】:

我的应用显示了一个项目集合,我想添加一个项目向下钻取视图。

我只能得到一半的解决方案;我找到了合适的文档并使用该文档来呈现模板:

var item = Items.findOne('my_id');

$('#main').html(
    Meteor.render(function () {
        return Templates.item(item)
    }));

这会成功呈现单个项目并绑定相应的事件。

问题来了,模板不是反应式的!如果我使用关联的事件处理程序或从控制台更改其数据,则不会更新模板。但是,页面刷新会显示更新后的数据。

我是 Meteor noobie,所以这可能很简单。任何帮助将不胜感激。

【问题讨论】:

  • 会不会是你有一个超出的右括号? return Templates.item(item)) 应该是 return Templates.item(item)
  • 对不起,这只是一个错字。现在更新问题。

标签: javascript meteor meteor-blaze


【解决方案1】:

在我看来,您并没有按照他们真正想要的方式使用模板。

流星应用以主 html 标记开头,该标记只能在您的应用中存在一次。

<head>
  <title>My New Fancy App</title>
</head>
<body>
  {{>templateName}}
</body>

然后你添加一个模板..

<template name="templateName">
  {{#each items}}
    template or relevant html goes here..
  {{/each}}
</template>

现在您需要一个模板助手来为您的 {{#each items}} 块助手提供数据..

Template.templateName.helpers({
  items: function(){ return Items.find({}) }
});

所有这些都在客户端定义..

然后您将需要一个集合,并且该集合应在客户端和服务器上都定义。

Items = new Meteor.Collection('items');

现在只要您的收藏中有记录,这应该可以工作。

由于您只希望呈现单个文档,您可以稍微更改帮助程序和模板..

首先助手变成:

Template.templateName.helpers({
  item: function(){ return Items.findOne() }
});

那么模板就可以通过document引用返回的文档的值了,所以我们把我们的模板改成:

<template name="templateName">
  {{item.propertyName}}
</template>

【讨论】:

  • 感谢您的回答。但是,我希望呈现 items 集合的单个成员。这不符合 Meteor 约定吗?
  • 你去吧,我已经更新了我的答案,以展示如何将单个文档从集合呈现到模板中。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多