Backbone / RequireJS嵌套列表中的循环依赖

时间:2013-01-14 18:42:18

标签: javascript jquery backbone.js requirejs circular-dependency

我在Backbone中使用RequireJS设置了一个嵌套的类别结构。

在此结构中,类别集合包含类别模型,单个类别模型可以包含类别集合。

不幸的是,这似乎导致RequireJS中可怕的循环依赖问题。我已经阅读了关于RequireJS(http://requirejs.org/docs/api.html#circular)的文档但是我发现'a'和'b'的解释令人困惑。

这是我的代码,导致问题:

define([

    "jquery",
    "underscore",
    "backbone",
    "collections/categories"

    ], function( $, _, Backbone, CategoriesCollection ) {

    var Category = Backbone.Model.extend({

        defaults: {
            title: "Untitled"
        },

        parse: function(data) {
            this.children = new CategoriesCollection( data.children, {parse: true} );
            return _.omit( data, "children" );
        }

    });

    return Category;

});

...

define([

    "jquery",
    "underscore",
    "backbone",
    "models/category"

    ], function( $, _, Backbone, CategoryModel ) {

    var Categories = Backbone.Collection.extend({
        model: CategoryModel
    });

    return Categories;

});

我想知道以前经历过这种情况的人是否有助于引导我朝着正确的方向前进。

先谢谢你的帮助,

2 个答案:

答案 0 :(得分:11)

您需要在模型中需要时再次使用require集合,因为最初传递的Collection可能是未定义的:

define([

    "jquery",
    "underscore",
    "backbone",
    "collections/categories"

    ], function( $, _, Backbone, CategoriesCollection ) {

    var Category = Backbone.Model.extend({

        defaults: {
            title: "Untitled"
        },

        parse: function(data) { 
            if(!CategoriesCollection){
              CategoriesCollection = require("collections/categories");
            }

            this.children = new CategoriesCollection( data.children, {parse: true} );
            return _.omit( data, "children" );
        }

    });

    return Category;

});

在示例中,他们也导入require,但它也应该在没有导入的情况下工作。

答案 1 :(得分:0)

为此,您应该考虑使用像Backbone Relational这样的插件。