2015-11-18 3 views
0

У меня есть класс, написанный в CoffeeScript:«Это» ключевое слово в классе CoffeeScript

class PresentationFramework 
    constructor: (framework) -> 
     log.info 'Looking for presentation framework module: ', framework 
     @template = fs.readFileSync path.join(framework, 'template.html'), 'utf8' 
     @renderer = handlebars.compile @template 
     @helpers = require path.join framework, 'helpers.js' 
     @render_deck = (data) => 
      Object.keys(@helpers).forEach (key) -> 
       handlebars.registerHelper key, @helpers[key] 
       @renderer(data) 
     @ 

Он компилирует к следующему JS:

PresentationFramework = (function() { 
    function PresentationFramework(framework) { 
     log.info('Looking for presentation framework module: ', framework); 
     this.template = fs.readFileSync(path.join(framework, 'template.html'), 'utf8'); 
     this.renderer = handlebars.compile(this.template); 
     this.helpers = require(path.join(framework, 'helpers.js')); 
     this.render_deck = (function(_this) { 
     return function(data) { 
      return Object.keys(_this.helpers).forEach(function(key) { 
      handlebars.registerHelper(key, this.helpers[key]); 
      return this.renderer(data); 
      }); 
     }; 
     })(this); 
     this; 
    } 

    return PresentationFramework; 

    })(); 

Я написал это с намерением следующее :

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

Метод render_deck, затем должен пройти через вспомогательные функции dict (итерации по клавишам), а затем зарегистрировать каждую функцию хэндлеров dict с помощью рулей.

Это используется в nodejs сценария следующим образом:

plugin = PresentationFramework(sessiondata.framework); 
deck = plugin.render_deck(sessiondata); 

Однако, если я пытаюсь это в узел консоли возвращает следующую ошибку:

/usr/users/TGAC_ga002/bward/github/slidewinder/lib/slidewinder_lib.js:78 
      handlebars.registerHelper(key, this.helpers[key]); 
                ^

TypeError: Cannot read property 'slidewinder' of undefined 
    at /usr/users/TGAC_ga002/bward/github/slidewinder/lib/slidewinder_lib.js:78:56 
    at Array.forEach (native) 
    at PresentationFramework.render_deck (/usr/users/TGAC_ga002/bward/github/slidewinder/lib/slidewinder_lib.js:77:45) 
    at slidewinder (/usr/users/TGAC_ga002/bward/github/slidewinder/lib/slidewinder_lib.js:106:19) 
    at Object.<anonymous> (/usr/users/TGAC_ga002/bward/github/slidewinder/bin/slidewinder.js:31:3) 
    at Object.<anonymous> (/usr/users/TGAC_ga002/bward/github/slidewinder/bin/slidewinder.js:33:4) 
    at Module._compile (module.js:435:26) 
    at Object.Module._extensions..js (module.js:442:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:311:12) 

Это мой первый раз, написание что-то серьезное в CoffeeScript и JS. Я считаю, что этот вопрос, вероятно, с тем, как «это» используется, я могу видеть в скомпилированный JS, что линии:

handlebars.registerHelper(key, this.helpers[key]); 

, вероятно, следует:

handlebars.registerHelper(key, _this.helpers[key]); 

Хотя я думал, что мое использование CoffeeScript '=>' должен был помешать этому.

Любые указатели приветствуются. Большое спасибо.

Может ли кто-нибудь дать мне указатели на то, что проблема может быть здесь?

Большое спасибо.

ответ

1

вероятно Object.keys(@helpers).forEach (key) -> переключает контекст, попробовать Object.keys(@helpers).forEach (key) =>

+0

Это просто трюк! Спасибо! – Ward9250

Смежные вопросы