2012-05-21 68 views
4

我想在下面的一個project.The使用骨幹關係和CoffeeScript的是事情我想模型的類型在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 

只需從生成的JavaScript

var MainModel, NestedModel, mm, nm; 

導致正確的行爲第1行去除「NestedModel」變量。顯然,我無法繼續從生成的JavaScript中刪除變量定義。我究竟做錯了什麼?

好吧,它似乎是一個範圍界定問題。請參閱以下jsFiddle example。但是爲什麼我不能只引用本地函數範圍中的類?

回答

0

但是爲什麼我不能只引用本地函數範圍中的類?

類被實現爲立即調用函數表達式

理解設計模式如立即調用的函數表達式的關鍵是要實現JavaScript有功能範圍(但不阻斷範圍),並通過將值傳遞關閉內部的引用。

參考