【问题标题】:'This' keyword in a CoffeeScript classCoffeeScript 类中的“This”关键字
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 2018-10-12
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2014-04-10
      • 2011-11-09
      相关资源
      最近更新 更多