我正在尝试创建一个通用辅助函数,可用于触发Backbone Marionette模块上的事件。您可以使用'module','event'和'params(optional)'键或一组此类对象传递一个对象。如果您将具有module
和event
属性的单个对象传递给它,它将为该模块调用该事件。如果你还传递了一个params
属性,它是一个数组,它也将传递它。这就是我到目前为止所做的:
/**
* Triggers events for given module(s)
*
* @param {object|array} options - Either a single object with 'module', 'event' and 'params (optional)' keys, or an array of such objects
*/
var triggerModuleEvents = function (options) {
require(['webapp'], function (WebApp) {
var i, module, event, params;
if (options instanceof Array) {
for (i = options.length; i--;) {
module = WebApp.module(options[i].module);
event = options[i].event;
params = undefined;
params = options[i].params;
if (typeof params === 'undefined') {
module.trigger(event);
} else if (params instanceof Array) {
params.unshift(event);
module.trigger.apply(this, params);
} else {
throw new TypeError('Params must be an array of parameters to pass with the event.');
}
}
} else if (typeof options === 'object') {
module = WebApp.module(options.module);
event = options.event;
module.trigger(event);
params = undefined;
params = options[i].params;
if (typeof params === 'undefined') {
module.trigger(event);
} else if (params instanceof Array) {
params.unshift(event);
module.trigger.apply(this, params);
} else {
throw new TypeError('Params must be an array of parameters to pass with the event.');
}
} else {
throw new TypeError("Argument must be an object with 'module' and 'event' keys, or an array of such objects.");
}
});
}
所以,我遇到的问题是触发器方法(module.trigger(event)
)工作正常,但我无法传递params
数组。由于我不知道可能有多少参数,我需要使用apply()
但是有一些语法问题或者我缺少的东西,但是看不到。具体来说,这一行似乎没有做任何事情 - module.trigger.apply(this, params)
这是一个如何调用助手的例子:
Utils.triggerModuleEvents([
{
module: 'Foo',
event: 'some:event:namespace',
params: [ null, true ]
},
{
module: 'Bar',
event: 'another:event:namespace'
}
]);
答案 0 :(得分:4)
问题是使用this
关键字,因为我看到您要做的只是更改参数顺序而不是将范围上下文更改为this
,因此您应该将其更改为:
module.trigger.apply(module, params);