0

我正在学习Marionette.js。我正在尝试运行特定的上下文回调,因为我创建了 2 个具有不同上下文的回调。

var callback1=new Backbone.Marionette.Callbacks();
callback1.add(function(argu1){alert("This is first context"+argu1.parameters)},"context1");
callback1.add(function(argu1){alert("This is second context"+argu1.parameters)},"context2");
//I want to run only callback which one have context is `context1`.
callback1.run({parameters:"Gran"},"context1");

根据我的要求,我应该只获得第一个上下文警报。但是我得到了两个警报框。

我怎样才能解决这个问题。

谢谢

4

1 回答 1

2

这实际上不是 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);

希望这可以帮助!

于 2013-11-04T07:30:25.777 回答