如何在传递参数时重构Meteor中的Handlebars模板和帮助程序代码?

时间:2014-01-02 19:18:23

标签: javascript meteor handlebars.js

任何想法如何允许我的BioPic Handlebars助手(我正在使用Meteor)为param'所有者'允许不同的上下文。我将showBioPic称为另一个模板的部分,即

<template name="myMain">
    {{#each post}}
        {{> showBioPic}}
    {{/each}}
    Do a bunch of other stuff here too.
</template>

我希望能够传入不同的“所有者”值,具体取决于调用模板,即Meteor.userId,post.owner,anotherUsersId。即如果我使用{{#each user}}这没有所有者字段,它有一个userId,所以BioPic助手不起作用。

<template name="showBioPic">        
    {{#with BioPic owner}}
        <img src="{{cfsFileUrl 'size48x48gm'}}" alt="Profile Picture: {{_id}}">
    {{else}}
        <img class="showShared" src="images/default-biopic-48x48.png" alt="Default Profile Picture">
    {{/with}}
</template>


Template.showBioPic.BioPic = function (IN_ownerId)    
   return BioPicsFS.findOne( { owner: IN_ownerId });
};

2 个答案:

答案 0 :(得分:1)

如果使用模板助手是一个选项,那么这样的事情应该有效:

Template.myMain.helpers({
  showBioPicWithContext: function (owner) {
    return Template.showBioPic(owner);
  }
});

<template name="myMain">
    {{#each post}}
        {{showBioPicWithContext id}}
    {{/each}}
    Do a bunch of other stuff here too.
</template>

<template name="showBioPic">
    {{#if _id}}
        <img src="{{cfsFileUrl 'size48x48gm'}}" alt="Profile Picture: {{_id}}">
    {{else}}
        <img class="showShared" src="images/default-biopic-48x48.png" alt="Default Profile Picture">
    {{/if}}
</template>

答案 1 :(得分:0)

我不确定我是否了解您的问题的详细信息,但在我的一个项目中,我做了类似的事情:

Handlebars.registerHelper('BioPic', function(user) {
  if (_.isString(user)) {
    // assume user is an id
  } else {
    // assume user is an object like Meteor.user()
  }
});

Handlebars helpers只是函数,因此您可以测试传递给它们的参数的值并相应地执行操作。在上面的示例中,当user是一个字符串时,我们可以假设它是一个id并返回类似Pictures.findOne({owner: user});的内容。您可以根据user输入的所有可能变体添加更多子句。