50

我有一个像

Template.user_profile.helpers({
  user:function() {
     return Meteor.users.find({'profile.front_name':Session.get('slug')}).fetch()[0];
  }
});

我想在集合中添加一个助手,它可以访问user助手并将其_id与当前用户进行比较_id,以判断用户是否正在访问自己的个人资料。我正在使用一些非常难看的东西:

Template.user_profile._tmpl_data.helpers.user()

最终代码:

Template.user_profile.helpers({
  user:function() {
     return Meteor.users.find({'profile.front_name':Session.get('userId')}).fetch()[0];
  },
  isCurrentUser: function() {
    return Template.user_profile._tmpl_data.helpers.user()._id === Meteor.userId();
  }
});

有没有更好的方法来访问另一个助手?

4

5 回答 5

34

我刚刚在控制台中意外发现了这一点:

Template.registerHelper
function (name, func) {                                                                             
  Blaze._globalHelpers[name] = func;                                                                                   
} 

所以,Blaze._globalHelpers就是我们要找的!

于 2014-11-26T15:26:53.717 回答
12

您可以使用以下方法调用模板助手(不是全局助手 - 这是 outluch 的答案):

Template.tplName.__helpers.get('helper').call()

MDG 建议使用常规函数,然后将其传递给助手、事件等。见这里

16 年 6 月 16 日更新
实际上,我强烈建议您简单地使用manuel:viewmodel - 它可以缓解许多 Blaze 头痛......

于 2015-07-12T21:00:28.123 回答
4

当我在寻找从另一个助手调用助手的方法时,我发现 Meteor 1.0 定义了可供所有其他助手使用的“Template.registeredHelpers”。https://docs.meteor.com/#/full/template_registerhelper

Template.registerHelper("checkedIf",function(value){
  return value?"checked":"";
});
于 2014-11-03T11:31:31.703 回答
2

你甚至可能不需要调用这样的助手。已经内置了一个 currentUser 助手。

http://docs.meteor.com/#template_currentuser

{{currentUser}}
于 2013-06-22T12:25:13.847 回答
0

也许这对你有用:

  //js
Template.foo.helpers({ bar: function() {
 return this.userId == Meteor.userId(); },
 domain: function() {
 var a = document.createElement('a'); a.href = this.url;
 return a.hostname;
 } });

 ownsDocument = function(userId, doc) { return doc && doc.userId === userId;}

 Posts = new Meteor.Collection('posts');
 Posts.allow({
 update: ownsDocument, remove: ownsDocument
 });

  //html
{{#if bar}}<a href="{{pathFor 'postEdit'}}">Edit</a>{{/if}}
于 2014-03-04T10:15:20.983 回答