Requirejs动态引用子模块方法?

Requirejs dynamic reference to sub module methods?

使用 requires,我将较大的 class 结构拆分为使用目录中其他模块的模块。有一个实例化其他子模块的主文件。这是一个有两个模块的 API class。一个处理 post 将数据发送到端点,另一个包含 post 模块的辅助函数:

define([
'./Post',
   './Helper'
], function (PostModule, HelperModule) {
    'use strict';
    var module = function () {
        this.Post = new PostModule();
        this.Helper = new HelperModule();
    };
    return module;
});

现在我可以像这样链接这些模块:

var foo = new ApiModule();
foo.Post.postToAPI();
foo.Helper.matchAPIactionToEvent();

这正是我想要的..

但是,问题出在 Post.js 文件中,它对 Helper.js 文件一无所知。所以我不能利用任何这些方法。我想在 Post.js 文件中做的是能够在同一个 class 中引用其他函数,如下所示:

define([
'../environment',
'loglevel',
'../utility/Utility',
'jquery'
], function (EnvironmentModule, log, UtilityModule, $) {
    'use strict';
    var module = function () {
        var environment,
            utility,
            api;

        environment = new EnvironmentModule();
        utility = new UtilityModule();

        this.postToAPI = function (event, payload, callback) {
            var apiEndpoint,
                requestIdString,
                eventAndAction;

            apiEndpoint = environment.getEnvironmentPath().API;
            requestIdString = utility.String.generateRandomString(32);

            /*** THIS IS HOW I WANT TO CALL THE HELPER METHODS ***/
            eventAndAction = this.Helper.matchAPIactionToEvent(event);
            /*** THIS IS HOW I WANT TO CALL THE HELPER METHODS ***/

            payload.event = eventAndAction.event;
            payload.action = eventAndAction.action;
            payload.requestID = requestIdString;
            payload = $.param(payload);

            $.post(apiEndpoint + '?' + payload, function (result) {
                if (callback) {
                    callback(result);
                }
            });
            return;
        };
    };
return module;
});

我想出了一个可行的解决方案,我在 Post.js 的定义语句中将 '../api/Helper' 作为数组值之一传递;但我不想那样做。 我想要的是 Post.js 能够访问同一目录 中包含的任何其他模块的任何方法。这样我就不必明确定义它们。在 Post.js 内实例化一个新的 ApiModule() 似乎是错误的。这是目录结构:

Modules/api/Api.js
Modules/api/Post.js
Modules/api/Helper.js
...

我希望这是有道理的。这可能吗?

由于您希望 any 个子模块访问 any 个其他子模块,您可以将父模块作为子模块构造函数的参数:

var module = function () {
    this.Post = new PostModule(this);
    this.Helper = new HelperModule(this);
};

让子模块存储此信息:

var module = function (parent) {
    this.parent = parent;

然后使用这个this.parent调用其他子模块的方法:

eventAndAction = this.parent.Helper.matchAPIactionToEvent(event);

请注意,如果您要在 Post.js 中使用 RequireJS 加载 '../api/Helper',您将 not 能够使用相同的对象实例作为在父模块上定义的实例。您必须构建一个新对象以用于 Post.js.