主干:为什么把`$('#footer')`分配给`el`?
我发现了以下陈述:
el: '#footer' 
 var todosView = new TodosView({el: $('#footer')}); 
  为什么把$('#footer')分配给el ?  这真是让我困惑。  我在这里阅读这篇文章,Backbone.js视图中的$ el和el有什么区别?  ,仍然困惑。 
 另外,我读了: view.$el属性相当于$(view.el)和view.$(selector)相当于$(view.el).find(selector) 。 在我们的TodoView示例的render方法中,我们看到this.$el用来设置元素的HTML, this.$()用于查找类“edit”的子元素。 
 但是,有人说如果你调用$(this.el) ,你只是继续执行jqueryselect器来获得相同的jquery对象。  '$ el'是$(this.el)的caching版本 
什么是“caching版本”?
  $el和el什么区别? 
  el视图属性 
this.el可以从DOMselect器string或元素中parsing出来; 否则它将从视图的tagName,className,id和attributes属性中创build。 如果没有设置,this.el是一个空的div,这往往是很好的。
 它是一个DOM元素对象引用。  不要直接设置el ,如果要更改它,请使用view.setElement方法 。 
  $el属性 
视图元素的cachingjQuery对象。 一个方便的引用,而不是重新包装DOM元素。
我喜欢用户mu太短的说法 :
this.$el = $(this.el);
 也不要直接设置$el ,使用view.setElement方法 。 
  el选项 
一个
el引用也可以传递给视图的构造函数。
 new Backbone.View({ el: '#element' }); new Backbone.View({ el: $('#element') }); // unecessary 
 它覆盖el属性,然后用于$el属性。 
如果select器string被传递,它将被它所代表的DOM元素replace。
 为什么把$('#footer')分配给el? 
  this.el可以是一个jQuery对象。 您可以看到Backbone确保el是一个DOM元素, $el是它在_setElement函数中的一个jQuery对象: 
_setElement: function(el) { this.$el = el instanceof Backbone.$ ? el : Backbone.$(el); this.el = this.$el[0]; },
 这显示了为什么this.$el相当于$(this.el) 。 
 但是什么是Backbone.$ ? 
 骨干保持对$的引用。 
对于Backbone而言,jQuery,Zepto,Ender或My Library(开玩笑)拥有
$variables。
 在我们的例子中, $是jQuery,所以Backbone.$就是jQuery,但是Backbone的依赖是灵活的: 
Backbone唯一的硬依赖是Underscore.js (> = 1.8.3)。 对于使用Backbone.View的 RESTful持久性和DOM操作,包含jQuery (> = 1.11.0)和json2.js以支持较旧的Internet Explorer。 ( Underscore和jQuery API的模仿,如Lodash和Zepto ,也将倾向于工作,具有不同程度的兼容性。)
  this.$(selector)相当于$(view.el).find(selector) 
 实际上, 它更高效一些 , $ view函数只是: 
$: function(selector) { return this.$el.find(selector); },
什么是caching的jQuery对象?
 在这种情况下,这只意味着一个jQuery对象被保存在一个variables中,这个variables在视图中被重用。 它避免了每次使用$(selector)查找元素的代价高昂的操作。 
 你可以(也应该)尽可能的使用这个小优化,比如在render函数里面: 
 render: function() { this.$el.html(this.template(/* ...snip... */)); // this is caching a jQuery object this.$myCachedObject = this.$('.selector'); }, onExampleEvent: function(e) { // avoids $('.selector') here and on any sub-sequent example events. this.$myCachedObject.toggleClass('example'); } 
  使用$作为前缀jQuerycaching对象variables只是一个标准,而不是要求。 
骨干的源代码less于2000行,它有很好的文档logging和易于阅读。 我极力鼓励大家深入了解底层的逻辑。
他们还提供了一个更容易阅读的注释源页面 。
额外阅读
- 从这里开始: 主干文档
- 骨干介绍
- 骨干模式
- 最佳做法与骨干