6

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

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

4 回答 4

5

解决此问题的另一种方法是使用完全不同的方法来处理单击,并调用“打开”,以便另一个进程可以调用它。正如另一个人所提到的,您在事件哈希中指定的方法是 jquery 委托包装器,因此对于参数您无能为力,因为您将获得委托提供的内容。因此,在这种情况下,创建另一个执行实际图标单击的方法,该方法将调用 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
    }
}
于 2012-08-01T18:35:20.100 回答
4

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

最关键的一句话是:</p>

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

因为主干的事件是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
}
......
于 2012-08-01T16:44:27.997 回答
2

如果您知道 ID 变量的类型,您可以使用 javascripttypeof()检查是否为真,或者您可以使用UnderscoreJS中的_.isObject检查 ID 是否为对象

于 2012-08-01T16:39:59.263 回答
0

我认为 Brendan 或 fejustin 的答案是最好的(实际上我投给了他们)。但是,如果您真的致力于只有一个功能,您可以创建id第二个参数并忽略第一个参数。

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

  }
},

someOtherMethod : function(){
  this.open(null, id);
}
于 2012-08-01T19:47:23.847 回答