3

Backbone jsを学習しようとしていますが、bindAll/bind関数で提供されるアンダースコアライブラリと関数で提供されるjQueryを使用したイベントバインディングの違いを理解するのに問題があります。これが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
  ...

質問:

  1. これら2つは機能的に同等ですか?
  2. はいの場合、jQueryコードははるかに明確で明確に見えます。これは個人的な好みの問題ですか?

よろしくお願いします。

バーラト

4

1 に答える 1

2

jQueryの「on」は、Backboneの「bind/bindAll」とはまったく異なる目的で使用されます。jQueryの「オン」の目的は、イベントが発生したときに関数を呼び出すことです。UnderscoreのbindまたはbindAllの目的は、関数をオブジェクトにバインドすることです。つまり、関数が呼び出されるたびに、この値は、bindを呼び出すときに渡したオブジェクトになります。アンダースコアのbindAllは、一度に複数の関数を使用することを除いて、bindとまったく同じことを行います。

Backboneを使用してビルドする場合、これらが一緒に使用されることがわかります。モデルを変更するために内部的に呼び出す関数を使用してモデルを設定するとします。jQueryまたはBackboneの「on」関数を使用してその関数をイベントにバインドした場合、イベントがトリガーされたときに、これはイベントをトリガーしたDOM要素になります。つまり、この関数でのこれへの参照機能しなくなります。もうモデル、それはdom要素です。ただし、モデルのコンストラクターで_.bind(this、callback)を呼び出すと、これが常にモデルであることが保証されます。

バックボーンは、jQueryの「オン」に似ているがバックボーンイベントに使用される「オン」関数も実装します。バックボーンドキュメントで読むことができます

于 2012-09-17T18:27:28.147 に答える