Meteor, how to access to a helper from another helper?

JavascriptMeteorhandlebars.js

Javascript Problem Overview


I have a helper like

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

I want to add a helper to the collection which could access the user helper and compare its _id with the current user _id, to tell whether the user is visiting its own profile. I'm using something pretty ugly:

Template.user_profile._tmpl_data.helpers.user()

The final code:

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

Is there any better way to access another helper?

Javascript Solutions


Solution 1 - Javascript

I've just accidentally discovered this in the console:

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

So, Blaze._globalHelpers is what we are looking for!

Solution 2 - Javascript

You can call a template helper (not global helper - which is in outluch's answer) with:

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

MDG suggests using a regular function and then passing it to helpers, events and so on. See here.

Update 16.06.16
Actually I strongly advise to simply use manuel:viewmodel - it alleviates so many Blaze headaches...

Solution 3 - Javascript

As I was searching for a way to call a helper from another helper, I found that Meteor 1.0 defines "Template.registeredHelpers" that are available for all other helpers to use. https://docs.meteor.com/#/full/template_registerhelper

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

Solution 4 - Javascript

You might not even need to call a helper like that. There is a currentUser helper already built in.

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

{{currentUser}}

Solution 5 - Javascript

maybe this would work for you:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJonathan de M.View Question on Stackoverflow
Solution 1 - JavascriptoutluchView Answer on Stackoverflow
Solution 2 - Javascriptavalanche1View Answer on Stackoverflow
Solution 3 - JavascriptFrançoisView Answer on Stackoverflow
Solution 4 - JavascriptBrian BoltonView Answer on Stackoverflow
Solution 5 - JavascriptGeriTolView Answer on Stackoverflow