当前位置: 首页 > 面试题库 >

Backbone:为什么要将`$('#footer')`分配给`el`?[重复]

阎元徽
2023-03-14
问题内容

我发现以下陈述:

el: '#footer'](https://addyosmani.com/backbone-fundamentals/#getting-set-up)

var todosView = new TodosView({el:$('#footer')});

另外,我读到:该view.$el属性等效于$(view.el)view.$(selector)并且等效于$(view.el).find(selector)。在TodoView示例的render方法中,我们看到this.$el用于设置元素的HTML,并this.$()用于查找类“edit”的子元素。


问题答案:

$el和之间有什么区别el

el视图属性

this.el可以从DOM选择器字符串或Element解析;否则会从视图的创建tagNameclassNameid
attributes属性。如果未设置,this.el则为空div,通常就可以了。

它是一个DOM元素对象引用。
不要el直接设置,如果要更改它,请改用该view.setElement方法

$elproperty

视图元素的缓存jQuery对象。一个方便的引用,而不是总是重新包装DOM元素

 this.$el = $(this.el);

不要$el直接设置,使用view.setElement方法。

el选项

一个el参考,也可以通过在该视图的构造函数

new Backbone.View({ el: '#element' });
new Backbone.View({ el: $('#element') }); // unecessary

它会覆盖该el属性,然后将该$el属性用于该属性。

如果传递了选择器字符串,则将其替换为其表示的DOM元素。

为什么要分配$('#footer')给el?

 _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(玩笑)拥有该$变量。

在我们的例子中,$是jQuery,Backbone.$也是jQuery,但是Backbone依赖项很灵活:

Backbone唯一的硬依赖性是Underscore.js(>=1.8.3)。要使用Backbone.View实现RESTful持久性和DOM操作,请包括 jQuery(> =1.11.0)和json2.js,以支持较早的InternetExplorer。(类似Underscore和jQueryAPI的Lodash和Zepto等也可以在不同程度的兼容性下正常工作。)

this.$(selector) 相当于 $(view.el).find(selector)

事实上, 这是一个有点更有效$查看功能就是:

 $: function(selector) {
   return this.$el.find(selector);
 },

什么是缓存的jQuery对象?

在这种情况下,这仅意味着jQuery对象保留在变量内,该变量在视图内被重用。它避免了$(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');
}

给jQuery缓存的对象变量加上前缀$只是一种标准,而不是必需的。

Backbone的源代码少于2000行,它有据可查且易于阅读。我强烈鼓励每个人都深入其中,以轻松理解基本逻辑

他们还提供带注释的源页面 ,它甚至更易于阅读。



 类似资料:
  • 问题内容: 我一直在使用IIFE中和,并一直在使用的结构如下: 方法1: 但是,我经常看到以下情况,其中将变量分配给 方法2: 注意: 此问题 不是 关于此模式是什么或IIFE是什么。这与为什么要 在IIFE上 使用返回变量及其与Angular实践的关系有关。 在Angular方法1中工作正常,但是在我看到的许多原始JS示例中,都使用了方法2。我的假设是,封装在其中的任何内容都可以通过它进行调用。

  • 问题内容: 以下语句: 因错误而失败: 为什么在这里需要演员表? 我发现了几篇文章,解释了为什么您不能进行反向操作(将T分配给a),但这是显而易见的(可以理解)。 注意:我在Eclipse Luna下对此进行编码,所以我不知道这是Luna Quirk还是泛型中确实不了解的东西。 问题答案: 协方差vs协方差vs不变性 是 不变的 。 结果是, 是 不是一个亚型 的 在Java中,变量可以保存 相同

  • 问题内容: 我多次听说,在实例化对象时应该执行以下操作: “接口”名称=新的“类”(); 例如,针对实现的类链表: 实现许多接口,包括队列,双端队列等。上面的代码和 要么 为什么必须同时指定两次类型?似乎多余,但oracledocs似乎没有提及。 问题答案: 在Java 7中是多余的。可以将其重写为。 你想写类似的原因: 如果您改变主意,则可以为您提供以后更改数据收集的自由。这样,您的代码将更加灵

  • 问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如

  • 我只是在进行围棋之旅,我对指针和接口感到困惑。为什么这个Go代码不编译? 也就是说,如果是一个,为什么不是一个? 我收到的错误消息是:

  • 问题内容: 浏览Java API源代码时,我经常看到方法参数已重新分配给局部变量。为什么要这样做? 这在java.util.HashMap中 问题答案: 这是线程安全性/更好性能的规则。在易失。如果将变量分配给局部变量,它将变为局部堆栈变量,该变量自动是线程安全的。而且,修改局部堆栈变量不会强制“先发生”,因此在使用它时不会产生同步损失(与之不同的是,每次读/写操作都会导致易失性,这会花费您获取/