开发者问题收集

无法读取未定义的属性,但属性存在

2016-07-20
546

我在模板助手中遇到了一个奇怪的错误,我希望有人能和我一起看看。​​基本上,我在客户端控制台中遇到的错误是 getArena().height 未定义。但是,console.log(getArena().height) 返回了正确的属性值。这似乎是导致我遇到错误的计时问题,但我的应用程序实际上正在运行。我可以做些什么来缓解这个控制台错误?

    //My template helper function
yGrids: function() {

        console.log(getArena);
        console.log(getArena().height);
        var yArray = [];
        for (var i=0;i<(getArena().height);i++){
            yArray.push({});
        }
        return yArray;
    },


// The console results
function getArena() {                                                                                              // 50
    return Arenas.findOne(Session.get('arena_id'));                            …
Exception in template helper: TypeError: Cannot read property 'height' of undefined
    at Object.yGrids (http://localhost:3000/app/app.js?hash=c17abf51d6af6541e868fa3fd0b26e34eea2df28:94:35)
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:2994:16
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:1653:16
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:3046:66
    at Function.Template._withTemplateInstanceFunc (http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:3687:12)
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:3045:27
    at Object.Spacebars.call (http://localhost:3000/packages/spacebars.js?hash=65db8b6a8e3fca189b416de702967b1cb83d57d5:172:18)
    at http://localhost:3000/app/app.js?hash=c17abf51d6af6541e868fa3fd0b26e34eea2df28:24:22
    at .<anonymous> (http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:2754:17)
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:1875:20
function getArena() {                                                                                              // 50
    return Arenas.findOne(Session.get('arena_id'));                            …
2
2个回答

当引用可能尚未通过订阅加载的集合时,这是 Meteor 助手中非常常见的问题。通常,您希望显示加载模板而不是实际布局,直到您的订阅 准备就绪 。或者(不太优雅)您可以使用以下方法保护自己:

var arena = getArena();
var height = arena && arena.height;
Michel Floyd
2016-07-20

无论 getArena() 返回什么,您都应该通过设置反应变量将其存储在反应变量中,并且您可以通过 get() 方法访问辅助程序中的反应变量

khem poudel
2016-07-21