我正在使用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
,则该依赖文件将被加载得太晚。
在这种情况下会采用什么方法?升值。
答案 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;
}
}
....
模型应该在初始化运行时加载。
希望有所帮助。