'这' CoffeeScript类中的关键字

时间:2015-11-18 09:33:04

标签: javascript node.js class 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;

  })();

我的写作意图如下:

在使用构造函数(给定目录路径)创建对象时,将读取几个文件并将内容分配给类实例的字段。特别是,helper字段被指定为从另一个文件/模块导入的函数字典。

然后,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中编写任何严肃的内容。我认为这个问题可能与这个&#39;使用,我可以在编译的JS中看到,行:

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

应该是:

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

虽然我认为我使用了CoffeeScript&#39; =&gt;&#39;应该已经阻止了这一点。

非常感谢任何指针。 非常感谢。

任何人都可以指出这个问题可能在哪里吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

可能Object.keys(@helpers).forEach (key) ->切换上下文, 试试Object.keys(@helpers).forEach (key) =>