在RequireJS中注册许多对象

时间:2013-04-22 09:13:22

标签: javascript requirejs

我的模型应该在浏览器和服务器中具有相同的结构和行为。为了能够重用代码,我选择了NodeJS。我想的并不是那么简单的任务,但多亏this article现在我可以编写通用代码了。

我试图序列化我的模型时遇到了一个问题。每个对象类都应该有自己的ID(如a.b.C),所以当对象被序列化时,这个ID被添加到JSON中,然后用于创建空对象以将其反序列化为。

这意味着当我们获得JSON时,我们需要获取ID,然后通过它找到模块,然后创建空对象并填充它。因此,我们需要有模块ID和模块的映射。将其命名为“注册”。

注册需要初始化。为此,我们需要在序列化开始之前加载所有依赖项。如果我们将以常规的RequireJS方式进行,它将如下所示:

define([
    "odm/model/core/serializing/Person",
    "odm/model/core/serializing/Man"
],
    function (require, Person, Man) {
        var register = {
            _name_cls:{},
            _cls_name:{}
        };
        register.register = function (names) {
            for (var i = 0; i < names.length; i++) {
                var name = names[i];
                var cls = require(name);
                register._name_cls[name] = cls;
                register._cls_name[cls] = name;
            }
        };
        register.byName = function (name) {
            return register._name_cls[name];
        };
        register.byCls = function (name) {
            return register._cls_name[name];
        };

        register.register([
            "odm/model/core/serializing/Person",
            "odm/model/core/serializing/Man"
        ]);

        return register;
    }); 

正如您所看到的,要注册新对象,我们需要在寄存器中的3个位置手动添加它 - 链接到模块,模块作为函数参数中的参数,模块作为寄存器(名称)函数的参数。

是否有更简单的注册对象方式?

1 个答案:

答案 0 :(得分:0)

我将寄存器模块与要注册的其他模块分开:

register.js:

define(function (require) {
    var register = {
        _name_cls:{},
        _cls_name:{}
    };
    register.register = function (names) {
        for (var i = 0; i < names.length; i++) {
            var name = names[i];
            var cls = require(name);
            register._name_cls[name] = cls;
            register._cls_name[cls] = name;
        }
    };
    register.byName = function (name) {
        return register._name_cls[name];
    };
    register.byCls = function (name) {
        return register._cls_name[name];
    };

    return register;
});

寄存器all.js

使用Array.prototype.slice获取模块参数。

define(["register", "odm/model/core/serializing/Person", "odm/model/core/serializing/Man"], function (register) {
    var modules = Array.prototype.slice.call(arguments, 1);
    register.register(modules);
});