Backbone.js:手动定义 el 与使用 id 自动定义

Backbone.js: defining el manually vs. automatically with id

我的问题很简单。为什么以下工作有效(即单击黑色方块时显示警报):

$(document).on('ready', function() {
 var MainView = Backbone.View.extend({
  
        el : "#id",
      
  events : {
   "click" : function() {
    alert("this works");
   }
  },

 });
 var main_view = new MainView();
});
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.2.1/backbone-min.js">
</script>
<style>
  #id {
  width : 10vw;
  height : 10vh;
  background-color : #000000;
}
</style>
</head>
<body>
<div id="id">
</div>
</body>
</html>

但以下不是:

$(document).on('ready', function() {
 var MainView = Backbone.View.extend({
  
        id : "id",
      
  events : {
   "click" : function() {
    alert("this works");
   }
  },

 });
 var main_view = new MainView();
});
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.2.1/backbone-min.js">
</script>
<style>
  #id {
  width : 10vw;
  height : 10vh;
  background-color : #000000;
}
</style>
</head>
<body>
<div id="id">
</div>
</body>
</html>

来自 backbone 文档网站:

"this.el can be resolved from a DOM selector string or an Element; otherwise it will be created from the view's tagName, className, id and attributes properties".

这里没有任何迹象表明如果我不手动设置 el 事件将无法绑定...

此外,在创建后检查 main_view 对象表明两种情况下的 el 表面上是相同的。当 el 从 id 推断出来时,为什么在第二个例子中点击没有被绑定? backbone 有什么哲学是我在这里遗漏的吗?

el 的文档是这样说的:

this.el can be resolved from a DOM selector string or an Element; otherwise it will be created from the view's tagName ...

强调我的。

因此,如果您有此看法:

el: 'some-selector-string'

然后 Backbone 将在 DOM 中查找该选择器并将找到的内容用作 el:即它将 解析 DOM 节点的选择器并将该节点用作最终的 el 和 Backbone 假定它正在使用现有节点。

如果你有这个:

id: 'id',
tagName: 'div',
...

在您看来,然后 Backbone 将根据这些属性 创建 el。请注意,它只说它将创建 el,而没有说 el 将添加到 DOM。如果 Backbone 创建 el 那么它希望您将它添加到页面。

在这两种情况下,您的视图中都会有一个 el,但只有第一种情况 (el: 'selector') 会给您一个实际在页面上的 el

如果您要让 Backbone 从 idtagName 和朋友创建 el,则需要添加 el 到你自己的页面。常见模式如下所示:

// In the view...
render: function() {
    this.$el.html('whatever goes inside the el');
    return this;
}

// And then outside the view
var v = new YourView;
$('some-container-element').append(v.render().el);
// Now the el is on the page and usable ------^^

如果您要求 Backbone 在您的视图中创建带有 id: 'some-id'el,并且页面上已经有 <div id="some-id">,那么您最终会得到两个 #some-id 节点:一个在页面上,一个仅在您的视图中。视图的事件始终通过视图的 el 绑定,因此页面上的 #some-id 上不会有任何事件。