【问题标题】:How to pass arguments to functions binded in events object in backbone.js如何将参数传递给backbone.js中事件对象中绑定的函数
【发布时间】:2012-08-01 15:19:37
【问题描述】:

我需要为 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 时,我希望它是未定义的。但是传递了一个事件对象。

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

【问题讨论】:

标签: javascript backbone.js backbone-views


【解决方案1】:

解决此问题的另一种方法是使用完全不同的方法来处理点击,并调用“打开”,以便其他进程可以调用它。正如另一个人所提到的,您在事件哈希中指定的方法是 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
    }
}

【讨论】:

  • 这里的流程是什么
【解决方案2】:

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

最关键的一句话是:

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

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

你可以像这样更新你的代码:

......

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
}
......

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      open : function(evt, id){
        if(id){
           //whatever
        } else {
      
        }
      },
      
      someOtherMethod : function(){
        this.open(null, id);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 2019-09-10
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多