【问题标题】:Using a Meteor function inside of a Template helper gives error在模板助手中使用 Meteor 函数会出错
【发布时间】:2016-04-22 19:13:52
【问题描述】:

尝试在模板助手中使用 Meteor 函数(在本例中为 Session)时遇到问题。

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

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

执行此代码会出现以下两个错误:

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

我正在尝试创建一个简单的朋友列表,如果用户单击其中一个,它会改变颜色。这应该非常简单。

Session变量保存在这里:

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

编辑:Meteor.user().profile.friends 返回:Array [ "juan", "asd" ]

EDIT2:

这是模板代码:

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

【问题讨论】:

  • debugger; 是做什么的?
  • 我用它在 Chrome 中放置了一个断点,但它不起作用。没有该行的代码仍然给出相同的错误。
  • @FranciscoRubinCapalbo profile.friends 是什么样的?它是一个字符串(id)数组吗?
  • @DavidWeldon 是的,它是一个字符串数组(每个朋友的用户名)。记录它会返回: Array [ "juan", "asd" ]
  • 比较时this的值是多少?它是您的数组元素之一还是整个数组?

标签: templates meteor helper


【解决方案1】:

这里的核心问题和this question一样。使用字符串作为数据上下文(在这种情况下迭代用户名数组)会导致一些奇怪的极端情况,因为每个都将转换为 String 实例。需要最少更改次数的修复方法是在您操作 Session 变量的两种情况下调用 toString

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

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

这将为您提供字符串原语,而不是 String 对象,Session 可以轻松使用。

顺便说一句,我不得不指出,使用 id 代替用户名通常是更安全的选择 - _id 永远不会改变,但如果用户名改变了,你的关联就会中断。

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 2014-01-08
    • 2015-09-14
    • 2014-06-20
    • 2015-01-06
    • 1970-01-01
    • 2013-06-19
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多