【发布时间】:2016-02-19 23:10:21
【问题描述】:
我有一个用 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;
})();
我写它的目的如下:
在使用构造函数(给定一个目录路径)创建对象时,会读取几个文件并将内容分配给类实例的字段。特别是,helpers 字段被分配为从另一个文件/模块导入的函数字典。
render_deck 方法,然后应该通过函数的 helpers dict(遍历键),然后它将 helpers 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 写任何严肃的东西。我相信问题可能在于“this”的使用方式,我可以在编译的 JS 中看到:
handlebars.registerHelper(key, this.helpers[key]);
应该是:
handlebars.registerHelper(key, _this.helpers[key]);
虽然我认为我使用 CoffeeScript '=>' 应该可以防止这种情况发生。
非常感谢任何指针。 非常感谢。
谁能给我指点一下这里可能出现的问题?
非常感谢。
【问题讨论】:
标签: javascript node.js class coffeescript