Meteor.js:如何将一个帮助器的数据上下文传递给另一个帮助器?

时间:2013-09-24 17:02:16

标签: javascript coffeescript meteor handlebars.js

所以,如果我有一个模板:

<template name="myTemplate">
  {{foo}}
</template>

和模板助手:

Template.myTemplate.foo = function() {
   blah = Session.get('blah');
   // code to do stuff with blah
   return blah;
};

然后我有另一个模板:

<template name="myOtherTemplate">
   {{foo}}
</template>

我希望这个模板的数据上下文与之前的模板相同,我该怎么办?

我首先想到使用{{#with}}可能是正确的方法,但似乎只有在第二个模板的范围已经在第一个模板的范围内时它才会起作用。

最终,我希望能够在另一个模板中使用为一个模板定义的所有助手,并知道如何做到这一点。

1 个答案:

答案 0 :(得分:3)

好像你问的是两个问题之一:

  1. 如果您在myOtherTemplate内使用myTemplate,则另一个模板的上下文将与此相同,除非您明确地将其他内容作为部分的第二个参数传递给它

    <template name="myTemplate">
      {{> myOtherTemplate foo}}
    </template>
    
  2. 如果要在多个模板中使用帮助程序,请在全局帮助程序中声明它。这将使{{foo}}在所有模板中可用:

    Handlebars.registerHelper("foo", function() {
       blah = Session.get('blah');
       // code to do stuff with blah
       return blah;
    });
    
  3. 如果您想动态创建自己的数据上下文(这种情况很少见),请执行以下操作:

    <template name="myTemplate">
      {{{customRender}}}
    </template>
    
    Template.myTemplate.customRender = function() {
       return Template.otherTemplate({
           foo: something,
           bar: somethingElse,
           foobar: Template.myTemplate.foo // Pass in the helper with a different name
       });
    };
    

    这个对象基本上是Iron-Router在渲染时传递给你的模板的东西。 请注意,您需要使用三个把手{{{ }}}或使用new Handlebars.SafeString告诉它不要逃避模板。