主干:为什么把`$('#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版本”?

$elel什么区别?

el视图属性

this.el可以从DOMselect器string或元素中parsing出来; 否则它将从视图的tagNameclassNameidattributes属性中创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和易于阅读。 我极力鼓励大家深入了解底层的逻辑。

他们还提供了一个更容易阅读的注释源页面

额外阅读

  • 从这里开始: 主干文档
  • 骨干介绍
  • 骨干模式
  • 最佳做法与骨干