如何将参数传递给backbone.js中events对象中绑定的函数

时间:2012-08-01 15:19:37

标签: javascript backbone.js backbone-views

我需要为Backbone中的events对象中使用的函数提供参数。

var DocumentRow = Backbone.View.extend({

    tagName: "li",

    className: "document-row",

    events: {
        "click .icon": "open",
        "click .button.edit": "openEditDialog",
        "click .button.delete": "destroy"
    },

    render: function () {
        // do something
    }
});

现在让open的定义为:

function open(id) {
    if (id) {
      // do something
    } else {
      // do something else
    }
}

我将从另一个函数调用open,并在调用它时传递id。所以根据我是否传递id,我需要做不同的事情。我如何在Backbone中执行此操作? 目前,通过点击调用id我希望它是未定义的。但是传递了一个事件对象。

为什么会发生这种情况?如何传递参数?

4 个答案:

答案 0 :(得分:5)

另一种解决方法是使用一种完全不同的方法来处理点击,并调用“open”,以便其他进程可以调用它。正如另一个人所提到的,你在事件哈希中指定的方法是jquery委托包装器,因此对于params你可以做的事情并不多,因为你将得到的是委托提供的内容。因此,在这种情况下,创建另一个方法来执行将调用open的实际图标点击:

events: {
    "click .icon": "open",
    "click .button.edit": "openEditDialog",
    "click .button.delete": "destroy"
},
/**
* Specifically handles the click and invokes open
*/
handleIconClick : function(event) {
    // ...process 'event' and create params here...
    this.open(params);
},
/**
* This can be called remotely
*/
open : function(id) {
    if (id) {
      // do something
    } else {
      // do something else
    }
}

答案 1 :(得分:4)

你可以在这里看到:http://backbonejs.org/docs/backbone.html#section-156

最关键的一句是:

this.$el.delegate(selector, eventName, method);

因为backbone的事件是jquery的委托(http://api.jquery.com/delegate/),所以传递的参数只是jquery的委托默认参数传递。

您可以像这样更新代码:

......

open : function(event) {
    //get id from event 
    var id = event.xxx ;//pseudo code
    if (id) {
      this.openid(id);
    } else {
      // do something else
    }
},
//your another function direct call openid
openid: function(id){
    // do something
}
......

答案 2 :(得分:2)

如果您知道ID变量的类型,可以使用javascript typeof()检查是否为true,或者您可以检查ID是否是来自UnderscoreJS的_.isObject的对象

答案 3 :(得分:0)

我认为Brendan或者fejustin的答案是最好的(实际上我投票给他们)。但是如果你真的致力于只有一个函数,你可以使id成为第二个参数并忽略第一个参数。

open : function(evt, id){
  if(id){
     //whatever
  } else {

  }
},

someOtherMethod : function(){
  this.open(null, id);
}