Backbone:为什么要把'$('#footer')`分配给`el`?

时间:2016-10-29 16:59:51

标签: javascript backbone.js

我发现了以下陈述:

el: '#footer'

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'的子元素。

但是,有人说 If you call $(this.el), your just keep executing the jquery selector to get the same jquery object. '$el' is the cached version of $(this.el)

什么是“缓存版本”?

1 个答案:

答案 0 :(得分:4)

$elel之间的区别是什么?

el view property

  

this.el可以从DOM选择器字符串或Element中解析出来;   否则,它将从视图tagNameclassNameid创建   和attributes属性。如果未设置,则this.el为空div,   这通常很好。

它是一个DOM元素对象引用。 请勿直接设置el ,如果您想要更改view.setElement method,请使用$el property

mu is too short puts it

  

视图元素的缓存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元素,而$elBackbone.$中的_setElement: function(el) { this.$el = el instanceof Backbone.$ ? el : Backbone.$(el); this.el = this.$el[0]; }, 的jQuery对象:

this.$el

这表明$(this.el)等同于$的原因。

但是什么是Underscore.js

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对象?

在这种情况下,它只表示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,更容易阅读。

补充阅读