这实际上不是 Marionette Callbacks 的正确使用。这些回调基本上是一个队列,运行时将调用您添加的所有回调,而无需任何条件。
第二个参数不是您要运行的回调的名称,而是运行时将应用于它的上下文(this的值)。当您使用 callback.add 定义自定义上下文时,callback.run 的第二个参数将被忽略。
在此处查看有关回调的文档:https ://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.callbacks.md
我认为你真正想要的是木偶命令:https ://github.com/marionettejs/backbone.wreqr#commands
使用命令,您可以注册函数,然后可以按名称调用。这种替代方案的唯一问题是您无法提供将应用于命令的单独上下文对象。
如果这是一个要求,那么您应该能够使用命令对象自己创建此功能,就像使用 _.bind 一样:
var commands = new Backbone.Wreqr.Commands();
var context = { n: 55 };
commands.setHandler("foo", _.bind(function() {
console.log(this); // outputs { n: 55 }
}, context));
commands.execute("foo");
如果您需要能够在执行时传递上下文,您可以执行以下操作:
var handler = function(n) {
console.log(this); // outputs { test: "hey" }
console.log(n); // outputs 55
};
commands.setHandler("foo", function(context) {
// only apply the arguments after the context (if any);
handler.apply(context, Array.prototype.slice.apply(arguments).slice(1));
});
commands.execute("foo", { test: "hey" }, 55);
希望这可以帮助!