6

I need to have arguments to the functions used in the events object in 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
    }
});

Now let the definition of open be:

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

I will call open from another function and will pass id when I call it. So based on whether I pass id or not I need to do different things. How do I do this in Backbone? Currently, id when called via click I expect it to be undefined. But an event object is passed.

Why does this happend and how can I pass an argument?

4

4 に答える 4

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
    }
}
于 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()を使用して true かどうかを確認するか、ID がUnderscoreJSの_.isObjectを使用してオブジェクトであるかどうかを確認できます。

于 2012-08-01T16:39:59.263 に答える
0

ブレンダンまたはフェジャスティンの答えが最高だと思います(実際、私はそれらに投票しました)。ただし、関数を1つだけにすることに真剣に取り組んでいる場合はid、2番目のパラメーターを作成し、最初のパラメーターを無視することができます。

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

  }
},

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