web-dev-qa-db-fra.com

Passer des paramètres dans l'objet d'événements Backbone d'une vue de backbone

J'ai les événements suivants pour une vue de réseau fédérateur. C'est une vue du produit - avec trois onglets ("Tous", "Top 3", "Top 5")

Puis-je en quelque sorte passer un paramètre dans la déclaration de méthode afin qu'il soit équivalent à ce qui suit (cela ne fonctionne pas)?

events : {
    "click #top-all":          "topProducts(1)"
    "click #top-three":      "topProducts(2)"
    "click #top-ten":         "topProducts(3)"
},
topProducts(obj){
    // Do stuff based on obj value
}
52
papdel

Vous pouvez plutôt placer l'argument supplémentaire dans un attribut de données sur l'élément cliquable; quelque chose comme ça:

<a id="top-all" data-pancakes="1">

Et puis topProducts peut le comprendre lui-même:

topProducts: function(ev) {
    var pancakes = $(ev.currentTarget).data('pancakes');
    // And continue on as though we were called as topProducts(pancakes)
    // ...
}
80
mu is too short

Je préfère généralement faire quelque chose comme ça:

events : {
   "click #top-all":    function(){this.topProducts(1);}
   "click #top-three":  function(){this.topProducts(2);}
   "click #top-ten":    function(){this.topProducts(3);}
},
topProducts(obj){
   // Do stuff based on obj value
}
39
Dre

Ce que vous pouvez faire, c'est simplement vérifier l'id de l'élément qui est reçu comme currentTarget dans les arguments.

topProduct: function (e) {
    var id = e.currentTarget.id;
    if (id == "top-all") // Do something
    else if (id == "top-5") // Do something
    else if (id == "top-3") // Do something
}
9
sachinjain024

Vous pouvez le faire en utilisant des fermetures:

EventObject.on(event, (function(){
    var arg = data; // Closure preserves this data
    return function(){
        doThis(arg);
    }   
})());
3
Yusuf Bhabhrawala