你能在多个模板之间共享数据吗?

5

有时候我会发现自己需要在多个模板中重复声明相同的数据。例如:

Template.auction_page.auctionDurations = function () {
  return [ 30, 60, 120 ];
};

Template.auction_editor.auctionDurations = function () {
  return [ 30, 60, 120 ];
};

我可以使用全局变量使其更好:

Template.auction_page.auctionDurations = function () {
  return global.auctionDurations;
};

Template.auction_editor.auctionDurations = function () {
  return global.auctionDurations;
};

但是有没有办法完全摆脱声明呢?换句话说,有没有默认的方式可以将一些全局数据共享给多个模板?

3个回答

5

在Helper的帮助下,找到了一个不错的解决方案。

你的全局变量:

global = _.extend({}, {
  regions: [ "Americas", "Europe", "Asia" ]
}

助手:

Handlebars.registerHelper("global", function(name) {
    return global[name];
});

现在,您的所有模板都可以使用它:
<select>
  {{#each global "regions"}}
  <option>{{this}}</option>
  {{/each}}
</select>

2
使用帮助函数是一个相当好的通用解决方案。为了完整起见,您还可以进行简单赋值:
Template.auction_page.auctionDurations = Template.auction_editor.auctionDurations;

啊,是的,这也可以是一个好的快捷方式。我认为这可能会取决于加载顺序是否起作用。但是查看一些我现有代码的情况表明,在这种情况下加载顺序并不重要。我在这里错过了什么吗? - Dave
加载顺序无关紧要有两个原因:1)您明确获取值,而不考虑呈现顺序,2)在这种情况下,特别是值是静态的(尽管我也已经用动态集合实现过)。 - David Wihl

1
您可以使用 Session 进行此操作:
  Template.auction_page.auctionDurations = function() {
    return Session.get("auctionDurations");
  }
  Template.auction_editor.auctionDurations = function() {
    return Session.get("auctionDurations");
  }

使用Session的一个好处是,由于它是一种响应式数据源,设置它将导致所有依赖它的模板重新渲染。因此,只要调用Session.set("auctionDurations", [ 30, 60, 120 ]),您的拍卖持续时间就会立即更新。

抱歉,你误解了。我想要完全摆脱这些赋值声明。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接