骨干视图:el和事件
Backbone view: el and events
我正在尝试使用Backbone,但在视图方面遇到了麻烦,特别是"el"和事件。我注意到我不是第一个,但不幸的是找不到我问题的最佳答案。
我的基本相关代码:
.HTML:
<!DOCTYPE html>
<html>
<head>
<script data-main="main" src="js/require.js"></script>
</head>
<body>
<div id="login"></div>
</body>
</html>
视图:
var view = Backbone.View.extend({
el: $("#login"),
initialize: function() {
this.el.html('<div>click here</div>'); // TypeError: this.el.html is not a function
}
.....
问题1:
请注意 initialize() 函数中的注释,这是我加载此代码时 Firebug 注册的错误。
但是,当我只删除"el"配置,而是将相应的赋值放在 initialize() 中时,运行时错误就消失了!
var view = Backbone.View.extend({
// "el" is now removed
initialize: function() {
this.el = $("#login"); // explicit assignement
this.el.html('<div>click here</div>'); // appends the div correctly
}
.....
问题2:在这两个示例中,如果我在 View 的事件配置中指定事件,则事件永远不会触发:
events: {
"click": "tryLogin"
},
...
请开导我! :)
您遇到的具体问题是this.el
不是 jQuery 对象,并且它没有.html
方法。 这就是this.$el
的目的; this.el
是一个原始的 DOM 元素,this.$el
是该对象的 jQuery 包装版本。您不应该用 jQuery 选择的元素覆盖el
。
遇到的真正问题是您正在尝试修改 DOM initialize
.
如果在 initialize
中,您想要访问 DOM 中已有的 DOM 元素,则需要将el:
选项传递给视图的构造函数。一般来说,你不应该这样做。您的视图应该在其render
方法中进行其 DOM 操作。
从文档中:
如果要创建引用 DOM 中已有元素的视图,请将该元素作为选项传入:
new View({el: existingElement})
在实践中,我发现el
和$el
仍然可用,但无论如何,您应该避免在initialize
中使用它们。坚持在 render
中修改 DOM,这是视图的"绘图"代码的具体位置:
var view = Backbone.View.extend({
el: '#login',
render: function () {
this.$el.append('<h1>What!</h1>');
return this;
}
});
$(function () {
new view().render();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/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.1.2/backbone-min.js"></script>
<div id="login"></div>
关于问题2,我无法重现您的问题。以下内容完全符合预期:
var View = Backbone.View.extend({
el: '#login',
events: {
'click': 'onClick'
},
onClick: function () {
alert('click!');
},
render: function () {
this.$el.append('<h1>What!</h1>');
}
});
new View().render();
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/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.1.2/backbone-min.js"></script>
<div id="login"></div>
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 对iPad上的点击事件反应缓慢
- 更改el属性时未激发主干视图事件
- $(this.el).find()在事件处理程序中工作,而不是在初始化函数(主干.js)中工作
- 骨干视图:el和事件
- Angular ES6,THIS,Scope和EL在JQLITE点击事件中全部未定义
- 动态呈现视图后,将事件绑定到视图的 el
- 在视图的event属性中使用backbone.js侦听与@el相关的事件
- 实现$(el).trigger('我的事件',{some:'数据'});在原生js中
- 动态创建主干'el'不是绑定事件
- js视图-将事件绑定到"el"之外的元素
- 动态设置子View $el并触发Backbone事件
- 骨干-在一个$el上绑定多个视图(事件是重复的)