Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Meteor handlebars {{#if}} turns strings into objects

The bug source code is here.

Let's say I'm looping over an array in Meteor using an ordinary {{#each}} loop. Each array element is a string, and I output the string every step using {{this}}. So far so good! If I use a handlebars helper to check typeof for this I'll get string. Sweet! Everything is as it should be.

But if I add an {{#if something }}-helper inside the {{#each}} (the something just returns true and thus keeps going and outputs {{this}}) the string will still look good in the HTML, but it is now an object in the typeof check!

This is super-annoying as all the (typeof someVarINeedToTest === 'string') my code might depend on now will return false.

Am I doing something wrong?

Or is this an actual bug?

If so: is it a Meteor-specific or Handlebars-specific bug?

Thanks!

Oh: the source link again. Just pull and run meteor and look in your browser console.

like image 859
Kristoffer K Avatar asked Nov 14 '13 16:11

Kristoffer K


1 Answers

This is because the this variable is supposed to always be an object in JavaScript so when someFunction.apply(someContext); is called in by handlebars, JavaScript turns someContext into an object no matter what it started as. See an example here: http://jsfiddle.net/SyKSE/1/

(In this case, someFunction represents the part of your template that's within the {{#if}} statement.)

A simple (albeit ugly) workaround would be to just always pass your data in as an object, so

['this', 'is', 'an', 'array', 'that', 'we\'re', 'looping', 'through'];

becomes:

[{val: 'this'}, {val: 'is'}, {val: 'an'}, {val: 'array'}, {val: 'that'}, {val: 'we\'re'}, {val: 'looping'}, {val: 'through'}];

And then you'd change your template to look at val instead of this

like image 145
Nathan Friedly Avatar answered Sep 29 '22 07:09

Nathan Friedly