2013-03-25 81 views
0

我正在使用Backbone/RequireJs javascript堆栈。我想实现的是动态地要求对Backbone.CollectionModel依赖关系,然后设置Collection依赖关系。动态加载依赖Backbone/RequireJs

我想保持Collection尽可能通用,我想分配不同的Models和其他URL取决于当前的主要上下文。目标是,只在特定的环境中加载所需的内容。

window.Collection = Backbone.Collection.extend({ 

    initialize: function(modelName,apiRoute){ 

     this.modelName = modelName; 
     this.apiRoute = apiRoute; 

     if (typeof(window[this.modelName]) === "function") { 
      this.model = window[this.modelName]; 
      this.url = "./api/" + this.apiRoute; 
     } 
    } 
... 

的这里的问题是,在主背景window[this.modelName]依赖性必须在Collection依赖之前加载。

MainContext需要一个类别的对象:

// MainContext.js  
define([ 
    ... 
    "model/Collection" 

和内部MainContext我解决所需的收集所需的依赖关系的名字值modelName变量(E“Toys”。)。如果我在MainContext中require(['model/Toys']),则该依赖文件将被加载得太晚。

这样的情况下会采取什么方法?欣赏。

+0

我并不完全遵循你正在尝试做的事情,但是你可能会尝试动态管理你的依赖关系,进行过早的优化。如果您保持简单并使用静态方法,那么RequireJS优化器应该能够为您处理所有这些问题:http://requirejs.org/docs/optimization.html – elevine 2013-03-25 17:59:40

回答

1

听起来好像你正在描述一个标准的Require.js循环依赖。换句话说,你有一个依赖玩具的集合,但是其他一些模块或模块正在使这些不可能。

您提到的标准解决方案是使用require的同步形式,即。 require(['model/Toys'])。但是,这听起来像是将它放入MainContext是错误的方式,因为它在载入时未载入MainContext时间。

解决这个问题的方法是使用在需要它在加载时,这听起来像您的收藏地点的同步要求。您的收藏需要该型号,但需要它在运行时(具体当运行initialize时)。如果您将代码更改为:

window.Collection = Backbone.Collection.extend({ 

    initialize: function(modelName,apiRoute){ 

     this.modelName = modelName; 
     this.apiRoute = apiRoute; 

     if (typeof(window[this.modelName]) === "function") { 
      this.model = require('model/' + this.modelName); 
      this.url = "./api/" + this.apiRoute; 
     } 
    } 
.... 

该模型应该在初始化运行时加载。

希望有所帮助。

+0

抱歉,延迟回复。这指出了我解决这个问题的正确方法,并且教会了我新的术语:循环依赖。谢谢! – TMichel 2013-04-04 14:44:17