0
votes

I am having trouble when trying to use a Meteor function (Session in this case) inside a template helper.

Template.friendList.helpers({
'friends': function(){
    return Meteor.user().profile.friends;
},
'selected': function(){
    debugger;
    var isSelected = Session.equals('selectedFriend', this);

    return isSelected ? 'active' : '' ;
}
});

Executing this code gives me the following two errors:

TypeError: Meteor.user(...) is undefined
Traza de la pila:
.friends@http://localhost:3000/app/client/ask/left/friendList.js?7383955f3a0a4e16805f78cf001a80239bc1ddc6:17:20
bindDataContext/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2986:14
Blaze._wrapCatchingExceptions/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1650:14
wrapHelper/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3038:14
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3671:12
wrapHelper/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3037:1
Spacebars.call@http://localhost:3000/packages/spacebars.js?1aedcc2aa3ae9ff5d860d73516110cedd77c033e:167:12
Template.friendList</<@http://localhost:3000/app/client/ask/left/template.friendList.js?8c20bf90b0e5df348201891218a57c7259d3c32e:8:12
Blaze.Each/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2751:17
viewAutorun/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1872:18
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3671:12
viewAutorun/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1870:1
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2211:12
viewAutorun@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1869:1
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:349:5
Tracker.Computation@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:237:5
Tracker.autorun@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:588:11
Blaze.View.prototype.autorun@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1882:14
Blaze.Each/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2748:1
fireCallbacks@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1952:1
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
Blaze._fireCallbacks/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1949:5
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2211:12
Blaze._fireCallbacks@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1948:3
Blaze._createView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1966:3
Blaze._materializeView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2011:3
materializeDOMInner@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1473:9
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1415:3
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1424:7
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2053:25
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
Blaze._materializeView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2017:3
Blaze.render@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2310:3
@http://localhost:3000/app/client/ask/left/askLeft.js?0ea57e51a604dff2305f4beb8ee3776e7cbacc29:18:23
fireCallbacks/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3330:9
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3671:12
fireCallbacks@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3326:1
Template.prototype.constructView/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3419:5
Blaze.View.prototype.onViewReady/fire/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1780:11
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2211:12
Blaze.View.prototype.onViewReady/fire/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1779:9
Tracker._runFlush@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:523:11
onGlobalMessage@http://localhost:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:365:11
 friendList.js:19
Error: ReactiveDict.equals: value must be scalar
Traza de la pila:
.equals@http://localhost:3000/packages/reactive-dict.js?8210a4b2fa52dbde9b3c8cf6b296192a34d7b899:149:1
.selected@http://localhost:3000/app/client/ask/left/friendList.js?7383955f3a0a4e16805f78cf001a80239bc1ddc6:25:30
bindDataContext/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2986:14
Blaze._wrapCatchingExceptions/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1650:14
wrapHelper/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3038:14
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3671:12
wrapHelper/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3037:1
Spacebars.call@http://localhost:3000/packages/spacebars.js?1aedcc2aa3ae9ff5d860d73516110cedd77c033e:167:12
Spacebars.mustacheImpl@http://localhost:3000/packages/spacebars.js?1aedcc2aa3ae9ff5d860d73516110cedd77c033e:104:10
Spacebars.mustache@http://localhost:3000/packages/spacebars.js?1aedcc2aa3ae9ff5d860d73516110cedd77c033e:108:16
Template.friendList</</<.class@http://localhost:3000/app/client/ask/left/template.friendList.js?8c20bf90b0e5df348201891218a57c7259d3c32e:12:38
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2211:12
.visitAttribute@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2139:1
.visitAttributes@http://localhost:3000/packages/htmljs.js?fd1566f5a5a4b277eb93f0a636a84a07ab9a83db:221:24
.visitAttributes@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2133:12
Blaze._expandAttributes@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2161:1
materializeTag/updateAttributes@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1517:27
viewAutorun/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1872:18
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3671:12
viewAutorun/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1870:1
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2211:12
viewAutorun@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1869:1
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:349:5
Tracker.Computation@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:237:5
Tracker.autorun@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:588:11
Blaze.View.prototype.autorun@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1882:14
materializeTag@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1530:9
materializeDOMInner@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1445:24
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1415:3
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1424:7
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2053:25
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
Blaze._materializeView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2017:3
Blaze.Each/</eachView.stopHandle<.addedAt/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2791:25
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
Blaze.Each/</eachView.stopHandle<.addedAt@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2764:9
diffArray/<.addedBefore@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:223:1
DiffSequence.diffQueryOrderedChanges/<@http://localhost:3000/packages/diff-sequence.js?f4337773c8aaf9bcaa5f5f22865660cbdd471eaa:201:1
_.forEach@http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:149:7
DiffSequence.diffQueryOrderedChanges@http://localhost:3000/packages/diff-sequence.js?f4337773c8aaf9bcaa5f5f22865660cbdd471eaa:193:3
diffArray@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:207:1
ObserveSequence.observe/computation</<@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:140:9
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
ObserveSequence.observe/computation<@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:114:7
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:349:5
Tracker.Computation.prototype._recompute@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:368:9
Tracker._runFlush@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:507:9
onGlobalMessage@http://localhost:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:365:11
 friendList.js:29
Error: ReactiveDict.equals: value must be scalar
Traza de la pila:
.equals@http://localhost:3000/packages/reactive-dict.js?8210a4b2fa52dbde9b3c8cf6b296192a34d7b899:149:1
.selected@http://localhost:3000/app/client/ask/left/friendList.js?7383955f3a0a4e16805f78cf001a80239bc1ddc6:25:30
bindDataContext/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2986:14
Blaze._wrapCatchingExceptions/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1650:14
wrapHelper/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3038:14
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3671:12
wrapHelper/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3037:1
Spacebars.call@http://localhost:3000/packages/spacebars.js?1aedcc2aa3ae9ff5d860d73516110cedd77c033e:167:12
Spacebars.mustacheImpl@http://localhost:3000/packages/spacebars.js?1aedcc2aa3ae9ff5d860d73516110cedd77c033e:104:10
Spacebars.mustache@http://localhost:3000/packages/spacebars.js?1aedcc2aa3ae9ff5d860d73516110cedd77c033e:108:16
Template.friendList</</<.class@http://localhost:3000/app/client/ask/left/template.friendList.js?8c20bf90b0e5df348201891218a57c7259d3c32e:12:38
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2211:12
.visitAttribute@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2139:1
.visitAttributes@http://localhost:3000/packages/htmljs.js?fd1566f5a5a4b277eb93f0a636a84a07ab9a83db:221:24
.visitAttributes@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2133:12
Blaze._expandAttributes@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2161:1
materializeTag/updateAttributes@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1517:27
viewAutorun/</<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1872:18
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:3671:12
viewAutorun/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1870:1
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2211:12
viewAutorun@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1869:1
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:349:5
Tracker.Computation@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:237:5
Tracker.autorun@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:588:11
Blaze.View.prototype.autorun@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1882:14
materializeTag@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1530:9
materializeDOMInner@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1445:24
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1415:3
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:1424:7
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2053:25
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
Blaze._materializeView@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2017:3
Blaze.Each/</eachView.stopHandle<.addedAt/<@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2791:25
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
Blaze.Each/</eachView.stopHandle<.addedAt@http://localhost:3000/packages/blaze.js?9391df93ba5076c2cfc61ee68724eb79b65f00d9:2764:9
diffArray/<.addedBefore@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:223:1
DiffSequence.diffQueryOrderedChanges/<@http://localhost:3000/packages/diff-sequence.js?f4337773c8aaf9bcaa5f5f22865660cbdd471eaa:201:1
_.forEach@http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:149:7
DiffSequence.diffQueryOrderedChanges@http://localhost:3000/packages/diff-sequence.js?f4337773c8aaf9bcaa5f5f22865660cbdd471eaa:193:3
diffArray@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:207:1
ObserveSequence.observe/computation</<@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:140:9
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:615:12
ObserveSequence.observe/computation<@http://localhost:3000/packages/observe-sequence.js?cd318009bd759e1458173f84a537c5dd315b4f86:114:7
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:349:5
Tracker.Computation.prototype._recompute@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:368:9
Tracker._runFlush@http://localhost:3000/packages/tracker.js?7776276660c988c38fed448d8262b925dffb5bc3:507:9
onGlobalMessage@http://localhost:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:365:11
 friendList.js:29

I'm trying to create a simple list of friends where if the user clicks in one it changes of color. This should be very straightforward.

The Session variable is saved here:

Session.setDefault('selectedFriend', null);
Template.friendList.events({
    'click .ableToSelect': function(evt){
        Session.set('selectedFriend', this);
    }
 });

EDIT: Meteor.user().profile.friends returns this: Array [ "juan", "asd" ]

EDIT2:

This is the template code:

<template name="friendList">
    <button type="button" class="friends-switch-panel btn btn-primary">Add Friend</button>
    <div class="list-group">
    {{#each friends}}
        <button class="list-group-item {{selected}} ableToSelect">
            {{this}}
        </button>
    {{/each}}
    </div>
</template>
1
what does debugger; do? - Christian Fritz
I used it to place a breakpoint in Chrome, but it didn't work. The code without that line still gives the same errors. - Francisco Rubin Capalbo
@FranciscoRubinCapalbo what does profile.friends look like? Is it an array of Strings (ids)? - David Weldon
@DavidWeldon Yes, it is an array of String (the username of the each friend). Logging it returns this: Array [ "juan", "asd" ] - Francisco Rubin Capalbo
What is the value of this when doing the comparison? Is it one of your array elements or the whole array? - Michel Floyd

1 Answers

3
votes

The core problem here is the same as in this question. Using strings as data contexts (in this case iterating over an array of usernames) results in some weird corner cases, because each will be converted into a String instance. The fix that requires the fewest number of changes is just to call toString in both situations where you manipulate the Session variable:

var isSelected = Session.equals('selectedFriend', this.toString());

and

Session.set('selectedFriend', this.toString());

That will give you a string primitive instead of a String object, which Session can readily use.

As an aside, I feel compelled to point out that using ids instead of usernames is generally a safer bet - an _id will never change, but if the username does, your association will break.