2016-07-20 8 views
0

Я получаю любопытную ошибку в помощнике шаблона, и я надеялся, что кто-то может заглянуть в нее со мной. В основном ошибка, которую я получаю в консоли клиента, заключается в том, что высота getArena() не определена. Однако 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 

ответ

1

Это очень распространенная проблема в помощниках метеора при обращении к коллекции, которая еще не была загружена через подписку. В общем, вы хотите показать шаблон загрузки вместо фактического макета, пока ваша подписка не будет готова. Или (менее элегантно), вы можете защитить себя:

var arena = getArena(); 
var height = arena && arena.height; 
+0

то, что я в конечном итоге делает это окружающие мою функцию с 'если (getArena()) {// функция }' и это, кажется, работает хорошо сейчас. – Scott

+0

Это нормально, это просто означает, что вы назовете это дважды. –

+0

Используется ли метод защиты выше, чтобы он не вызывался дважды? – Scott

0

Whatever getArena() возвращает вы должны хранить его в реактивном переменном, установив реактивную переменный, и вы можете получить доступ к реактивному вару в помощнике по ГЕТ() метод