需要动态引用子模块方法吗?

时间:2015-01-23 03:11:19

标签: javascript requirejs circular-dependency

使用requires,我将更大的类结构拆分为使用目录中其他模块的模块。有一个主文件可以实例化其他子模块。这是一个包含两个模块的API类。一个处理将数据发布到端点,另一个处理作为该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文件中做的是能够像这样引用同一个类中的其他函数:

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;
});

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

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

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

1 个答案:

答案 0 :(得分:1)

由于您希望任何子模块访问任何其他子模块,您可以做的是将父模块作为参数传递给子模块的构造函数模块:

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);

请注意,如果您正在考虑使用'../api/Helper' Post.js中的Post.js加载{{1}},那么 无法使用相同的对象实例在父模块上定义。您必须构建一个新对象,以便在{{1}}中使用。