在Backbone / RequireJs中动态加载依赖项

时间:2013-03-25 14:22:18

标签: javascript backbone.js requirejs

我正在使用Backbone / RequireJs javascript堆栈。我想要实现的是在设置Model依赖项之后动态地要求Backbone.Collection的{​​{1}}依赖项。

我希望保持Collection尽可能通用,我想根据主要的当前上下文分配不同的Collection和其他网址。目标是,仅在特定上下文中加载所需的内容。

Models

这里的问题是必须在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" 内部我解析了Collection所需依赖项名称值所需的MainContext变量(例如“modelName”)。如果在MainContext中有Toys,则该依赖文件将被加载得太晚。

在这种情况下会采用什么方法?升值。

1 个答案:

答案 0 :(得分:1)

听起来你正在描述一个标准的Require.js循环依赖。换句话说,你有一个依赖于Toys的Collection,但是其他一些模块或模块正在使它变得不可能。

您提到的标准解决方案是使用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;
        }
    }
....

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

希望有所帮助。