3 votes

Backbone js bindAll/bind versus jQuery on

J'essaie d'apprendre Backbone js, et j'ai du mal à comprendre la différence entre les liaisons d'événements utilisant les fonctions bindAll/bind fournies par la bibliothèque underscore et la fonction on fournie par jQuery. Voici un exemple en Coffeescript :

class Raffler.Views.Entry extends Backbone.View
  template: JST['entries/entry']
  tagName: 'li'

  events:
    'click': 'showEntry'

  initialize: ->
    @model.on('change',@render,this)
    @model.on('highlight',@highlightWinner,this)

  showEntry: ->
    Backbone.history.navigate("entries/#{@model.get('id')}", true)

  highlightWinner: ->
    $('.winner').removeClass('highlight')
    @$('.winner').addClass('highlight')

  render: ->
    $(@el).html(@template(entry: @model))
    this

This is a snippet of code from Ryan Bate's RailsCasts' on Backbone.js

Seems to me that the same code can be written using the underscore bindAll and bind functions as follows:

class Raffler....
  ...
  initialize: ->
    _bindAll @, 'render', 'highlightWinner'
    @model.bind 'change',@render
    @model.bind 'highlight',@highlightWinner
  ...

Questions :

  1. Ces deux éléments sont-ils équivalents d'un point de vue fonctionnel ?
  2. Si oui, le code de jQuery semble beaucoup plus clair et explicite. S'agit-il simplement d'une question de préférence personnelle ?

Merci d'avance pour votre temps.

Bharat

2voto

Abe Haskins Points 1338

La fonction "on" de jQuery est utilisée dans un but complètement différent de la fonction "bind/bindAll" de Backbone. L'objectif de "on" de jQuery est d'appeler une fonction lorsqu'un événement se produit. Le but de bind ou bindAll d'Underscore est de lier une fonction à un objet, ce qui signifie qu'à chaque fois que la fonction est appelée, la valeur de cette sera l'objet que vous avez passé lors de l'appel à bind. La fonction bindAll d'Underscore fait exactement la même chose que bind, mais avec plusieurs fonctions à la fois.

Vous verrez qu'ils seront utilisés ensemble lorsque vous construirez avec Backbone. Disons que vous avez un modèle configuré avec une fonction que vous appelez en interne pour modifier le modèle. Si vous utilisez la fonction "on" de jQuery ou de Backbone pour lier cette fonction à un événement, lorsque l'événement est déclenché, cette sera l'élément du DOM qui a déclenché l'événement, ce qui signifie que toute référence à cette dans cette fonction ne fonctionnera plus car cette n'est plus un modèle, c'est un élément dom. Cependant, si nous devions appeler _.bind(this, callback) dans le constructeur du modèle, cela garantirait que cette est toujours le modèle.

Backbone implémente également une fonction "on" qui est plus similaire à la fonction "on" de jQuery, mais utilisée pour les événements Backbone. On peut lire à ce sujet sur les documents relatifs à l'épine dorsale

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X