web-dev-qa-db-fra.com

Meteor, comment accéder à un assistant depuis un autre assistant?

J'ai une aide comme

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

Je veux ajouter un assistant à la collection qui pourrait accéder à l'assistant user et comparer son _id avec l'utilisateur actuel _id, pour indiquer si l'utilisateur visite son propre profil. J'utilise quelque chose d'assez laid:

Template.user_profile._tmpl_data.helpers.user()

Le code final:

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();
  }
});

Existe-t-il un meilleur moyen d'accéder à un autre assistant?

49
Jonathan de M.

Je viens de découvrir cela accidentellement dans la console:

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

Alors, Blaze._globalHelpers c'est ce que nous recherchons!

33
outluch

Vous pouvez appeler un assistant de modèle (pas un assistant global - ce qui est dans la réponse de outluch) avec:

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

MDG suggère d'utiliser une fonction régulière, puis de la transmettre aux assistants, aux événements, etc. Voir ici .

Mise à jour 16.06.16
En fait, je conseille fortement d'utiliser simplement manuel: viewmodel - il soulage tant de maux de tête Blaze ...

11
avalanche1

Alors que je cherchais un moyen d'appeler un assistant à partir d'un autre assistant, j'ai trouvé que Meteor 1.0 définit "Template.registeredHelpers" qui sont disponibles pour tous les autres assistants à utiliser. https://docs.meteor.com/#/full/template_registerhelper

Template.registerHelper("checkedIf",function(value){
  return value?"checked":"";
});
4
François

Vous n'aurez peut-être même pas besoin d'appeler un assistant comme ça. Il y a une aide couranteUser déjà intégrée.

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

{{currentUser}}
2
Brian Bolton

peut-être que cela fonctionnerait pour vous:

  //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}}
0
GeriTol