0

我正在使用 Backbone/RequireJs javascript 堆栈。我想要实现的是在设置依赖项之后动态地要求Modela的依赖项。Backbone.CollectionCollection

我想尽可能地保持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集合所需依赖项的名称值所需的变量(例如' Toys')。如果 irequire(['model/Toys'])在 MainContext 中,则该依赖文件将加载得太晚。

在这种情况下会采取什么方法?欣赏。

4

1 回答 1

2

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

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

解决这个问题的方法是在加载时不需要它的地方使用同步 require 这听起来像你的 Collection。您的 Collection 需要模型,但它在运行时需要它(特别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;
        }
    }
....

在您的初始化运行时,模型应该已经加载。

希望有帮助。

于 2013-03-25T20:16:13.823 回答