2

答え:

newクラス インスタンスを作成するときに、キーワードの使用を怠っていたことが判明しました。質問自体のコードは問題ありません。

質問:

コンストラクターがクラス (editor_for_node) で別のメソッドを呼び出すかなり単純なクラスがあります。呼び出しは jQuery each() ループ内で行われますが、外側にも移動しようとしました。

define ['jquery'], ($) ->
  class Editor
    constructor: (@node, @data, @template) ->
      @node.widgets().each (i, elem) =>
        data = if @data then @data[i] else null
        node = $(elem)
        @editor_for_node node, data

    editor_for_node: (node, data) ->
      console.log 'hello!'

  return {
    'Editor': Editor,
  }

@editor_for_node node, dataが呼び出されると、(Firebug で) というエラーが表示されますthis.editor_for_node is not a function

なぜこれが適切に機能しないのか、私には本当にわかりません.私が見ることができる奇妙な唯一の原因は、最初にrequire.jsのdefine関数を使用することです.

編集:生成された出力

(function() {

  define(['jquery'], function($) {
    var Editor;
    Editor = (function() {

      Editor.name = 'Editor';

      function Editor(node, data, template) {
        var _this = this;
        this.node = node;
        this.data = data;
        this.template = template;
        this.node.widgets().each(function(i, elem) {
          data = _this.data ? _this.data[i] : null;
          node = $(elem);
          return _this.editor_for_node(node, data);
        });
      }

      Editor.prototype.editor_for_node = function(node, data) {
        return console.log('hello!');
      };

      return Editor;

    })();
    return {
      'Editor': Editor
    };
  });

}).call(this);
4

1 に答える 1

4

最初: どのバージョンの CoffeeScript を使用していますか? 以前の特定のリリースでは、太い矢印がバグの原因でした。

最新 (1.3.1) を使用している場合は、これはインデントの問題であると断言します。コードをコピーして貼り付けると、正常に動作します。タブとスペースを混ぜていませんか?コンパイルされた出力に次の行が含まれていることを確認します

Editor.prototype.editor_for_node = ...

更新:この回答のコメントを参照してください。問題はnew、コンストラクターを呼び出すときにキーワードが使用されていなかったことです。

于 2012-05-10T14:58:05.220 に答える