使用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
...
我希望这是有道理的。这可能吗?
答案 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}}中使用。