2012-04-01 46 views
10

我是BackboneJS的新手,我使用RequireJS使用骨幹關係模型進行嵌套關係 - 我想我跑入循環問題。任何幫助將不勝感激!使用主幹創建嵌套模型j + backbone-relational + requireJS

我有以下的模型和集合:

/* Module Model at models/module*/ 
define([ 
'jquery', 
'underscore', 
'backbone', 
'backboneRelational', 
], function($, _, Backbone) { 

    var ModuleModel = Backbone.RelationalModel.extend({ 

     urlRoot: 'api/module', 
     _radius: 50, 
     relations: [{ 
      type: Backbone.HasMany, 
      key: 'children', 
      relatedModel: 'ModuleModel', 
      collectionType: 'ModuleCollection', 
      reverseRelation: { 
       key: 'parent_id', 
       includeInJSON: 'id' 
      } 
     }], 
     url: function() { 
      return this.id? 'api/module/' + this.id : 'api/module'; 
     } 
    }); 
    return ModuleModel; 
}); 

/* Module Collection */ 
define([ 
'jquery', 
'underscore', 
'backbone', 
'models/module' 
], function($, _, Backbone, ModuleModel) { 

    var ModuleCollection = Backbone.Collection.extend({ 

     model: ModuleModel, 
     url: 'api/modules' 
    }); 

    return ModuleCollection; 
}); 

當我初始化對象ModuleModel,它引發以下錯誤:

Relation=child; no model, key or relatedModel (function(){ parent.apply(this, arguments); }, "children", undefined) 

你能爲我指向正確的方向?

+0

類似於http://stackoverflow.com/questions/9225640/how-to-represent-uml-relations-with-backbone-relational – 2012-04-17 10:13:52

回答

4

這看起來像一個範圍界定問題。期間ModuleModel初始化它要創建本身hasMany關係,但它無法找到自己,它會給的說你在形式悲痛錯誤:

http://jsfiddle.net/yNLbq

一旦對象是從電流可達範圍的事情開始工作了:

http://jsfiddle.net/jDw5e

一個可能的解決辦法是讓模型和收集自己命名空間可從目前的範圍來達到。

希望這會有所幫助。

2

從骨幹-relational.js v0.5.0(線375)評論:
//「出口」應該是一個「relatedModel」如果給一個字符串可以上找到的全局對象。

如果在定義調用中需要特殊的'exports'值作爲依賴項,然後在返回之前將模塊放置到exports對象上,那麼可以將該模塊引用爲字符串或導出成員。

在ModuleModel.js:

define(['exports', 'use!backbone', 'use!backbone-relational'], function(exports, Backbone) { 
    var ModuleModel = Backbone.RelationalModel.extend({ 
    relations: [ 
     { 
     type: Backbone.HasMany, 
     key: 'groups', 
     relatedModel: 'ModuleModel', 
     collectionType: 'ModuleCollection' 
     } 
    ] 
    }); 
    exports.ModuleModel = ModuleModel; 
    return ModuleModel; 
}); 

和ModuleCollection.js:

define(['exports', 'use!backbone'], function(exports, Backbone) { 
    var ModuleCollection = Backbone.RelationalModel.extend({ 
    url: '/api/v1/module/'; 
    model: exports.ModuleModel; 
    }); 
    exports.ModuleCollection = ModuleCollection; 
    return ModuleCollection; 
}); 
+3

導出不是你定義的;它被特殊處理。 Requirejs創建一個字典並將其傳遞給需要'exports'的任何定義,以便您可以在定義調用之間共享值。你不需要創建一個文件,也不需要做任何特別的事情 - 只需使用神奇的名字'exports'作爲你的依賴關係之一。 – dokkaebi 2012-06-27 15:47:46

+0

請你可以說我應該實例化哪個模塊?兩者或只是一個,如果只是一個,ModuleCollection和ModuleModel之間? – 2012-06-27 16:30:02

+0

使用我發佈的代碼,ModuleModel和ModuleCollection應該按預期工作。在你的代碼中的其他地方,你可以做一些類似於'require(['ModuleCollection','ModuleModel'],function(ModuleCollection,ModuleModel){myModules = new ModuleCollection(); myModel = new ModuleModel({/ * some values * /} ); myModules.add(myModel);}'。這可能有助於看到你想要做什麼 - 如果這不能按預期工作,你可以在這裏打開一個新的問題並鏈接到它。 – dokkaebi 2012-06-27 16:59:45

3

我碰到這個問題從這裏: RequireJS + BackboneRelational + Self-Referential。他似乎從這個線程繼承了他的一些問題,所以我想我可能會添加我的硬幣。

首先,由於您使用的是RequireJS,因此沒有全局變量。您不能簡單地提供對象的名稱,您需要爲relatedModelcollectionType提供實際的對象引用。

你的最棘手的問題是,ModuleModelrelatedModel實際上是ModuleModel本身,當你把它分配給relatedModel(使用AMD模型),這將不被定義。在分配ModuleModel之前,您必須推遲分配。

最後,您需要解析循環引用。當他建議使用exports時,dokkaebi處於正確的軌道,但他的實施實際上濫用了exports。在導出時,按照他的建議直接將對象附加到exports,但是當您導入它時,您需要引用該模塊以使用它,而不是exports

這應該工作:

ModuleModel.js

define(['exports', 'ModuleCollection'], function (exports, Module) { 
    'use strict'; 

    var ModuleModel = Backbone.RelationalModel.extend({ 
     urlRoot: 'api/module', 
     _radius: 50, 
     relations: [{ 
      type: Backbone.HasMany, 
      key: 'children', 
      // ModuleModel is undefined; this line is useless 
      // relatedModel: ModuleModel, 
      // no globals in require; must use imported obj ref 
      collectionType: Module.Collection, 
      reverseRelation: { 
       key: 'parent_id', 
       includeInJSON: 'id' 
      } 
     }], 
     url: function() { 
      return this.id? 'api/module/' + this.id : 'api/module'; 
     } 
    }); 

    // Now that `ModuleModel` is defined, we can supply a valid object reference: 
    ModuleModel.prototype.relations[0].relatedModel = ModuleModel; 

    // Attach `Model` to `exports` so an obj ref can be obtained elsewhere 
    exports.Model = ModuleModel; 
}); 

ModuleCollection.js

define(['exports', 'ModuleModel'], function(exports, Module) { 
    'use strict'; 

    var ModuleCollection = Backbone.Collection.extend({ 
     // must reference the imported Model 
     model: Module.Model, 
     url: 'data.php' // <-- or wherever 
    }); 

    // Attach `Collection` to `exports` so an obj ref can be obtained elsewhere 
    exports.Collection = ModuleCollection; 
}); 

Main.js

define(['ModuleCollection'], function(Module) { 
    'use strict'; 

    var modules = new Module.Collection(); 
    modules.fetch().done(function() { 
     modules.each(function(model) { 
     console.log(model); 
     }); 
    }); 

}); 
2

我遇到了同樣的問題,並且按照Andrew Ferk所用的方法回答了他的問題:Backbone-relational submodels with RequireJS。問題的產生是因爲您將模型定義爲Require模塊,因此它們不存在於全局範圍內,其中骨幹關係可以查找它們。您可以爲您的模型定義一個範圍,並告訴骨幹關係在其中查找模型,而不是使用全局範圍(擊敗Require的目的)或導出(與關係有點棘手),而使用addModelScope()

//modelStore.js - A scope in which backbone-relational will search for models 
//Defined separately so you can access 'modelStore' directly for your models instead of requiring 'app' every time. 
define(['app'], function(app) { 
    app.modelStore = {}; 
    Backbone.Relational.store.addModelScope(app.modelStore); 
    return app.modelStore; 
} 

順便說一句,你應該填充你的Backbone依賴項,而不需要爲它需要jQuery和Underscore。

//ModuleModel (The ModuleModel module. Nice.) 
define(['modelStore', 'backbone', 'backboneRelational'], function(modelStore, Backbone { 
    modelStore.ModuleModel = Backbone.RelationalModel.extend({ 
     relations: [ 
     { 
      type: Backbone.HasMany, 
      key: 'groups', 
      relatedModel: 'ModuleModel', //Not modelStore.ModuleModel 
      collectionType: 'ModuleCollection' 
     } 
     ] 
    }); 
    return modelStore.ModuleModel; 
}); 

有點晚了,但希望它幫助別人。