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
.
使用 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
.