主干:为什么把`$('#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和易于阅读。 我极力鼓励大家深入了解底层的逻辑。
他们还提供了一个更容易阅读的注释源页面 。
额外阅读
- 从这里开始: 主干文档
- 骨干介绍
- 骨干模式
- 最佳做法与骨干