传递参数给骨干事件(Passing arguments to events in backbone)

2019-07-30 02:01发布

首先,我做了一些搜索和计算器没有答案/谷歌提供我想要的东西。

下面是我的代码片段:

//in the view
this.collection.on("add",triggerthis)
this.collection.add(predefinedModel)
triggerthis: function(a, b, c, d){
    //etc.
}

基本上,我希望能够通过上添加参数,并接收triggerthis的说法。 这可能吗?

提前致谢。

Answer 1:

你不能做到这一点,你所希望的方式,而无需使用无证功能。

如果我们看一下Collection#add ,我们会看到这一点:

add: function(models, options) {
  //...
  for (i = 0, l = add.length; i < l; i++) {
    (model = add[i]).trigger('add', model, this, options);
  }
  //...
}

注意:第四个参数来trigger 。 如果我们看一下在公开的接口trigger

触发 object.trigger(event, [*args])

触发指定事件或事件的空格分隔的回调。 随后的参数触发将沿该事件回调传递。

因此, add将调用监听器为f(model, collection, options)其中options是相同的options ,你通过什么Collection#add 。 其结果是,如果你这样做:

this.collection.add(predefinedModel, { undocumented: 'arguments' })

那么你可以在你的回调做到这一点:

triggerthis: function(model, collection, options) {
    console.log(options.undocumented);
}

演示: http://jsfiddle.net/ambiguous/bqWwQ/

你可以一整个阵列的过程中隧道或通过对象options这种方式。

第三个参数"add"事件未记录(至少不是我能找到),最接近于该文件是在一个音符0.3.3更新日志条目 :

无处不在的options参数现在作为最后一个参数全部通过"change"事件。

我不推荐这种方法,但它的存在,如果你需要它; 当然,你需要在你的测试套件来覆盖这一点,你需要确保你不使用任何键options是骨干网将使用。


一个更安全的方法是将附加一些额外的属性到模型:

model.baggage = { some: 'extra stuff };

然后剥离其关闭回调:

triggerthis: function(model, collection) {
    var baggage = model.baggage;
    delete model.baggage;
    //...
}

演示: http://jsfiddle.net/ambiguous/M3UaH/

你也可以使用不同的回调为不同的目的或通过你的额外的参数为完全成熟的模型属性。

还有_.bind

this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want'));

但将绑定参数由左到右,所以你必须指定你的回调将需要的所有参数。

演示: http://jsfiddle.net/ambiguous/jUpJz/



Answer 2:

如果传递给函数的值总是相同的,可以部分申请使用它_.bind (或本机Function.bind如果可用)

例如当你结合的处理程序,以add (假设triggerThis是在你的视图的方法):

this.collection.on('add', _.bind(this.triggerThis, this, a, b, c, d));

的定义triggerThis

triggerThis: function(a, b, c, d /*, model, collection, options - if you need them*/) {
  ...
}

如果你想传递参数给一个单独的附加通话时,您可以使用第二个options参数add ,然后处理,在事件处理程序。

this.collection.on('add', this.triggerThis, this);
this.collection.add(model, {
  someCustomValue: 'hello';
});

然后在您的处理程序:

triggerThis: function(model, collection, options) {
  var val = options.someCustomValue;
  ...
}


文章来源: Passing arguments to events in backbone