您可以跨多个模板共享数据吗?

时间:2012-12-22 08:16:31

标签: javascript meteor handlebars.js

我有时会发现自己向多个模板声明了相同的数据。例如:

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 个答案:

答案 0 :(得分:5)

找到一个好的解决方案(在助手的帮助下!)。

您的全球:

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

帮助者:

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

现在您的所有模板都可以使用它:

<select>
  {{#each global "regions"}}
  <option>{{this}}</option>
  {{/each}}
</select>

答案 1 :(得分:2)

使用辅助函数是一个非常好的通用解决方案。为了完整起见,您还可以进行简单的任务:

Template.auction_page.auctionDurations = Template.auction_editor.auctionDurations;

答案 2 :(得分: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 ]);

,您的竞价持续时间就会更新