我发现了以下陈述:
var todosView = new TodosView({el: $('#footer')});
为什么要将$('#footer')
分配给el
?这真让我困惑。我在这里阅读了帖子,What is the difference between $el and el in Backbone.js views?,仍然感到困惑。
另外,我读到:
view.$el
属性相当于$(view.el)
,view.$(selector)
相当于$(view.el).find(selector)
。在我们的TodoView示例的render方法中,我们看到this.$el
用于设置元素的HTML,this.$()
用于查找类'edit'的子元素。
$(this.el)
, your just keep executing the jquery selector to get the same jquery object. '$el' is the cached version of $(this.el)
什么是“缓存版本”?
答案 0 :(得分:4)
$el
和el
之间的区别是什么?el
view property
this.el
可以从DOM选择器字符串或Element中解析出来; 否则,它将从视图tagName
,className
,id
创建 和attributes
属性。如果未设置,则this.el
为空div
, 这通常很好。
它是一个DOM元素对象引用。 请勿直接设置el
,如果您想要更改view.setElement
method,请使用$el
property。
视图元素的缓存jQuery对象。一个方便的参考 而不是一直重新包装DOM元素。
我喜欢用户view.setElement
method:
this.$el = $(this.el);
也不要直接设置$el
,使用_setElement
function。
el
选项
el
引用也可以传递给视图的构造函数。
new Backbone.View({ el: '#element' });
new Backbone.View({ el: $('#element') }); // unecessary
它会覆盖el
属性,然后将其用于$el
属性。
如果传递了一个选择器字符串,它将替换为它所代表的DOM元素。
$('#footer')
分配给el? this.el
可以是jQuery对象。您可以看到Backbone确保el
是一个DOM元素,而$el
是Backbone.$
中的_setElement: function(el) {
this.$el = el instanceof Backbone.$ ? el : Backbone.$(el);
this.el = this.$el[0];
},
的jQuery对象:
this.$el
这表明$(this.el)
等同于$
的原因。
Backbone保留对$
的所有内容的引用。
对于Backbone的用途,jQuery,Zepto,Ender或My Library(开玩笑) 拥有
$
变量。
在我们的例子中,Backbone.$
是jQuery,所以this.$(selector)
只是jQuery,但Backbone依赖是灵活的:
Backbone的唯一硬依赖是Backbone.View(> = 1.8.3)。对于 使用jQuery的RESTful持久性和DOM操作,包括 json2.js(> = 1.11.0)和Lodash用于较早的Internet Explorer支持。 (下划线和jQuery API的模仿,例如Zepto和
$
view function, 也会有不同程度的兼容性。)
$(view.el).find(selector)
相当于$: function(selector) {
return this.$el.find(selector);
},
事实上,效率更高,annotated source page只是:
$(selector)
在这种情况下,它只表示jQuery对象保存在变量中,该变量在视图中重用。它避免了每次使用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');
}
函数内部:
$
使用{{1}}前缀jQuery缓存对象变量只是标准,而非要求。
Backbone的源代码不到2000行,它有很好的文档记录和易读性。我强烈鼓励每个人深入了解它,以便轻松理解基本逻辑。
他们还提供Backbone documentation,更容易阅读。