是否可以为listenTo回调绑定函数参数?
到目前为止,我添加了一个包装方法' myHandler'我想摆脱:
// Basic marionette layout
var view = Marionette.Layout.extend({
initialize: function() {
// wrapping view logic inside a custom object
this.controller = new MyViewController();
},
// creates a sub view and adds event handlers
someFunc: function() {
var subView = new MySubView();
// HERE: how to bind args for callback?
this.listenTo(subView, "myEvent", this.myHandler, this);
},
// this is a dummy wrapper that I want to remove
myHandler: function(e) {
this.controller.handleIt(this, e);
},
我想做的是:
someFunc: function() {
var subView = new MySubView();
// here wrapIt binds 'this' as first argument for handleIt
this.listenTo(subView, "myEvent",
wrapIt(this.controller.handleIt, this), this);
}
答案 0 :(得分:7)
listenTo
仅接受3个参数。如果你需要将函数绑定到某个对象,那么跨浏览器的方式是使用下划线_.bind
函数:
this.listenTo(subView, "myEvent", _.bind(this.myHandler, this))
然而,大多数情况下不需要将listenTo
打开的对象作为默认上下文。要阅读更多内容,请参阅这些github问题:
答案 1 :(得分:2)
为什么不在listenTo函数调用中使用函数?像这样:
// Basic marionette layout
var view = Marionette.Layout.extend({
initialize: function() {
// wrapping view logic inside a custom object
this.controller = new MyViewController();
},
// creates a sub view and adds event handlers
someFunc: function() {
var subView = new MySubView();
this.listenTo(subView, "myEvent", function (e) {
this.controller.handleIt(this, e);
}, this);
},
答案 2 :(得分:1)
Underscore是Backbone的硬依赖,这意味着您可以使用_.bind来设置上下文:
绑定 _.bind(function,object,[* arguments])
将函数绑定到对象,意味着无论何时调用函数,都将值 这将是对象。 (可选)将参数传递给函数 预填充它们,也称为部分应用。
您的示例可以写成
someFunc: function() {
var subView = new MySubView(),
callback = _.bind(this.controller.handleIt, this);
this.listenTo(subView, "myEvent", callback, this);
}
如果您希望将上下文作为函数的第一个参数,请将其作为第三个参数添加到_.bind
someFunc: function() {
var subView = new MySubView(),
callback = _.bind(this.controller.handleIt, this, this);
this.listenTo(subView, "myEvent", callback, this);
}
答案 3 :(得分:0)
是的,你可以在JQuery中使用代理功能来做到这一点 $ .proxy(this.controller.handler,this) 请参阅此处的文档 http://api.jquery.com/jQuery.proxy/