Использование Backbone-relational с CoffeeScript

Я пытаюсь использовать в проекте Backbone-relational и CoffeeScript. Ниже приведен пример в CoffeeScript того типа вещей, которые я пытаюсь смоделировать:

  class NestedModel extends Backbone.RelationalModel
    defaults:
     Description: 'A nested model'

  NestedModel.setup()

  class MainModel extends Backbone.RelationalModel
    defaults:
     Description: 'A MainModel description'
     StartDate: null

    relations: [
      type: Backbone.HasOne
      key:  'nestedmodel'
      relatedModel: 'NestedModel'
      includeInJSON: '_id'
      reverseRelation:
        type: Backbone.HasOne
        includeInJSON: '_id'
        key: 'mainmodel'   
    ]

  MainModel.setup()     

  nm = new NestedModel()
  mm = new MainModel(nestedmodel: nm)
  console.log mm.get("nestedmodel").get("mainmodel").get("Description")
  return 

Этот CoffeeScript создает следующий JavaScript:

  var MainModel, NestedModel, mm, nm;
  var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
    for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
    function ctor() { this.constructor = child; }
    ctor.prototype = parent.prototype;
    child.prototype = new ctor;
    child.__super__ = parent.prototype;
    return child;
  };
  NestedModel = (function() {
    __extends(NestedModel, Backbone.RelationalModel);
    function NestedModel() {
      NestedModel.__super__.constructor.apply(this, arguments);
    }
    NestedModel.prototype.defaults = {
      Description: 'A nested model'
    };
    return NestedModel;
  })();
  NestedModel.setup();
  MainModel = (function() {
    __extends(MainModel, Backbone.RelationalModel);
    function MainModel() {
      MainModel.__super__.constructor.apply(this, arguments);
    }
    MainModel.prototype.defaults = {
      Description: 'A MainModel description',
      StartDate: null
    };
    MainModel.prototype.relations = [
      {
        type: Backbone.HasOne,
        key: 'nestedmodel',
        relatedModel: 'NestedModel',
        includeInJSON: '_id',
        reverseRelation: {
          type: Backbone.HasOne,
          includeInJSON: '_id',
          key: 'mainmodel'
        }
      }
    ];
    return MainModel;
  })();
  MainModel.setup();
  nm = new NestedModel();
  mm = new MainModel({
    nestedmodel: nm
  });
  console.log(mm.get("nestedmodel").get("mainmodel").get("Description"));
  return;

Что выдает следующее предупреждение и ошибку

Warning:
Relation= child
; no model, key or relatedModel (function MainModel() {
              MainModel.__super__.constructor.apply(this, arguments);
            }, "nestedmodel", undefined)


Error:
Uncaught TypeError: Cannot call method 'get' of undefined

Простое удаление переменной NestedModel из первой строки сгенерированного JavaScript.

var MainModel, NestedModel, mm, nm;

Вызывает правильное поведение. Очевидно, я не могу продолжать удалять определение переменной из сгенерированного JavaScript. Что я делаю неправильно?

Хорошо, похоже, это проблема области видимости. См. следующий пример jsFiddle. Но почему я не могу просто ссылаться на классы в области локальной функции?


person Simon Lomax    schedule 21.05.2012    source источник


Ответы (1)


Но почему я не могу просто ссылаться на классы в области локальной функции?

Классы реализованы как немедленно вызываемые функциональные выражения.

Ключом к пониманию шаблонов проектирования, таких как немедленно вызываемые функциональные выражения, является понимание того, что JavaScript имеет область действия функции (но не область действия блока) и передает значения по ссылке внутри замыкания.

Ссылки

person Community    schedule 02.12.2014