2012-05-08 67 views
2

我正在評估中的骨幹關係插件造型樹。我有以下示例代碼簡單的自我指涉RelationalModel失敗

var SurveyTreeNode = Backbone.RelationalModel.extend({ 
    relations: [{ 
     type: Backbone.HasMany, 
     key: 'questions', 
     relatedModel: 'SurveyTreeNode' 
    }] 
}); 


var survey = { 
    id: 1, 
    questions: [ 
     { 
      id: 2, 
      text: 'What is your name?' 
     }, 
     { 
      id: 3, 
      text: 'What hours do you work?', 
      questions: [ 
       { 
        id: 3, 
        text: 'On Monday?' 
       }, 
       { 
        id: 4, 
        text: 'On Tuesday?' 
       } 
      ]     
     } 
    ] 
}; 

var questionTree = new SurveyTreeNode(survey); 

其產生(在谷歌瀏覽器控制檯):我已經加載此代碼到一個的jsfiddle

no model, key or relatedModel (function(){ parent.apply(this, arguments); }, "questions", undefined) 

,作爲誤差不顯示完全按照上述(顯示孩子元素可擴展):http://jsfiddle.net/hoffmanc/XsDQu/

回答

4

骨幹關係希望能夠找到相關模型的構造在全球範圍內,在relatedModel屬性給出的路徑。

的問題是,它沒有找到構造函數的SurveyTreeNode

我不知道你是如何執行上面的代碼在本地環境,或什麼的jsfiddle做包裝代碼(可能是包裹在某些DOMReady事件中),但在這兩種情況下,SurveyTreeNode都不在全局範圍內。

如果刪除SurveyTreeNode前var關鍵字,它會在全球範圍內可用,並且隨後的代碼工作。

看到這個的jsfiddle:http://jsfiddle.net/edwardmsmith/qTA83/

+0

¶典型的rtfm問題:D 「relatedModel:必需的。可以解析爲全局作用域上的對象或對Backbone.RelationalModel的引用的字符串。 – inf3rno

1

,如果你不想污染全局命名空間的另一個解決方法:

var MenuNode = function() { 
    Backbone.RelationalModel.apply(this, arguments); 
}; 
MenuNode = Backbone.RelationalModel.extend({ 
    constructor: MenuNode, 
    relations: [ 
     { 
      type: Backbone.HasMany, 
      key: "children", 
      relatedModel: MenuNode, 
      reverseRelation: { 
       key: "parent" 
      } 
     } 
    ] 
}); 

我建議增加一個Backbone.selfRelated(或類似的東西)標誌,以避免黑客攻擊喜歡這個。 https://github.com/PaulUithol/Backbone-relational/issues/347