使用模板助手的Meteor Blaze错误

时间:2014-12-15 01:31:00

标签: meteor iron-router meteor-blaze

我的大部分模板助手都会导致火焰错误,我不知道为什么。让他们更奇怪的是他们根本不会阻止模板中的渲染或事件,事实上,应用程序运行正常。

主要问题是凌乱,凌乱的控制台。下面是一个例子:

Template.templatename.helpers({
    adminhelper: function(){
        var theUser = Meteor.user(),
            theUserId = theUser['_id'];

        if(theUserId == "XXX"){
            return true;
        }
    }
});

只是检查哪个用户是管理员用户的一种方法。这导致:

Exception in template helper: TypeError: Cannot read property '_id' of undefined
    at Object.Template.templatename.helpers.adminhelper (http://localhost:3000/client/lib/helpers.js?37db222f849959237e4f36abdd8eba8f4157bd32:5:23)
    at http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:2693:16
    at http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:1602:16
    at Object.Spacebars.call (http://localhost:3000/packages/spacebars.js?3c496d2950151d744a8574297b46d2763a123bdf:169:18)
    at Template.manage.Blaze.If.HTML.HEADER.HTML.DIV.class (http://localhost:3000/client/views/template.templatename.js?868248757c652b031f64adad0edec9e2a276b925:6:22)
    at null.<anonymous> (http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:2454:44)
    at http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:1795:16
    at Object.Blaze._withCurrentView (http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:2029:12)
    at viewAutorun (http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:1794:18)
    at Tracker.Computation._compute (http://localhost:3000/packages/tracker.js?192a05cc46b867dadbe8bf90dd961f6f8fd1574f:288:36)

有趣的是,client / views / template.templatename.js不存在。我将所有帮助程序放在helpers.js文件中,并将所有事件放在events.js文件中。

我的路线

Router.route('/theurl',function(){
    this.render('templatename');
},{
    waitOn: function(){
        return Meteor.user();
    }
});

我可以做些什么来避免将来出现这些问题?

1 个答案:

答案 0 :(得分:2)

在提取Meteor.user()之前,只需使用guard检查是否存在_id。由于Meteor.user()需要订阅,因此在路由waitOn上等待并不起作用。或者你也可以这样做:

Template.templatename.helpers({
  adminhelper: function() {
    return Meteor.userId() === 'XXX';
  }
});

更好的解决方案是使用roles package