如何在渲染手柄帮助器后执行函数

时间:2013-08-12 16:53:38

标签: javascript meteor handlebars.js

如何在执行此Handlebars帮助程序后每次都执行一个函数执行?

Handlebars.registerHelper('renderPage', function() {
    return new Handlebars.SafeString(Template[Session.get('currentPage')]());
});

这是在Meteor中运行的,我有一个路由器在Session中设置一个新的'currentPage',因为Session是被动的,这就是我用'currentpage'设置的模板。

我可以通过使用带有内容元素的模板来实现,然后使用Template.templateName.rendered,但这对我不起作用,因为我想将它作为一个包,我现在想,你可以'将模板放入陨石包中。

如果是,我可以这样做:

Template.renderPage.content = function {
    return new Handlebars.SafeString(Template[Session.get('currentPage')]());
});

Template.renderPage.rendered = function () { ... }

2 个答案:

答案 0 :(得分:1)

如果您希望每次运行帮助程序时都运行一个函数,为什么不将它定义为帮助程序的一部分呢?

Handlebars.registerHelper('renderPage', function() {
    var ret = new Handlebars.SafeString(Template[Session.get('currentPage')]());
    someFunctionYouWantToRun();
    return ret;
});

更广泛地说,如果您希望您的函数和帮助程序在每次更改页面时运行,请创建包含其他页面的根级模板,然后将其附加到该页面的.rendered():

index.html

<body>
  {{> root}}
</body>
root.html

<template name="root">
{{#if CurrentPageIsHome}}
  {{> home}}
{{/if}}
</template>
root.js 中的

Template.root.currentPageIsHome = function() {
  return Session.equals("currentPage", "home");
}

Template.root.rendered = function() {
  // Code you want run on every template render of root and every subtemplate
}

更好的是,使用Meteor Router包。

答案 1 :(得分:0)

那么对我有用的是使用模板而不是帮助器。为了使这个模板能够从陨石包中运行,我必须将它们包装在Meteor.startup函数中,否则它就不会使模板变好。

Template.renderPage.content = function {
    return new Handlebars.SafeString(Template[Session.get('currentPage')]());
});

Template.renderPage.rendered = function () { ... }

然后我使用Template.xxx.rendered函数进行后挂钩。