开发者

why do bindAll in backbone.js views?

开发者 https://www.devze.com 2023-03-07 22:00 出处:网络
In backbone\'s todo demo the code has a few spots where _.bindAll(this,...) is used. Specifically it\'s used in the initialize function of both views. As far as I can tell it\'s necessary to do th开发

In backbone's todo demo the code has a few spots where _.bindAll(this,...) is used. Specifically it's used in the initialize function of both views. As far as I can tell it's necessary to do th开发者_运维知识库e following:

this.$('.todo-content').text(content);

But why would one want to do the above, when one can do:

$('.todo-content').text(content);

?


_.bindAll( this, ... ) is necessary not only for this.$( selector ).doSomething() but generally to be sure that this in your view's method is always pointing to the view itself.

For example, if we want to refresh our view when the model changes, we bind the view's render method to the model's change event:

initialize: function() {
    this.model.bind( 'change', this.render );
},

Without _.bindAll( this, 'render' ), when the model changes this in render will be pointing to the model, not to the view, so we won't have neither this.el nor this.$ or any other view's properties available.


As of Backbone 0.5.2, it's no longer necessary to use _.bindAll(this...) in your views to set the context of the "bind" callback functions, as you can now pass a 3rd argument to bind() that will set the context (i.e. "this") of the callback.

For example:

var MyView = Backbone.View.extend({
  initialize: function(){
    this.model.bind('change', this.render, this);
  },
  render: function(){
    // "this" is correctly set to the instance of MyView
  }
});


this.$ limits jQuery's context to the view's element, so operations are quicker.

Additionaly, this.$('.todo-item') won't find your elements with todo-item class outside your view's element.

0

精彩评论

暂无评论...
验证码 换一张
取 消