主干视图单击事件未启动
Backbone view click event not firing
以下是代码:
var view = Backbone.View.extend({
el:'#comment',
template:'',
initialize:function(){
this._getTemplate();
this.render();
},
event:{
'click #submit_btn' : 'submit'
},
_getTemplate:function(){
$.ajax({
...
});
},
render:function(){
this.$el.html(this.template);
},
submit:function(event){
alert('click');
}
});
我使用ajax从服务器获取html模板,它运行良好。我在加载模板时没有问题。
这是我想要插入模板的div。
<div id="comment">...</div>
这是模板。我只是展示了简单的结构。
<div>...</div>
<button id="submit_btn">submit</button>
<div>...</div>
有人能帮我解决吗?
事件未触发,因为当尝试将事件绑定到DOM元素时(即在View构造时),DOM元素不存在。来自主干文档:
Backbone将在实例化时自动附加事件侦听器,就在调用initialize之前。
由于#submit_btn
DOM元素匹配器不返回任何内容,因此不绑定任何事件。
在initialize()
方法中获取模板的技术会有问题。在大多数基于OO的开发模式中,对象的构造函数不应该做很多工作,返回的实例应该在构造函数完成时完全初始化。主干视图在这方面没有什么不同。这里所写的构造函数试图做很多工作,但在这里获取模板作为对象创建的一部分没有任何好处。事实上也有一些危害:如果您最终创建了多个View
实例,该怎么办?您最终会多次获取模板,即使内容完全相同。
强制任何类型的XHR同步也是有问题的。在同步请求期间,浏览器的主线程正忙于等待响应。在本例中,如果模板到达的时间超过几百毫秒,则您的应用程序对用户来说将显示为"冻结"。这提供了非常差的用户体验。异步代码可能感觉更复杂,但如果你正在构建一个基于JS的应用程序,即使复杂性很低,你也需要处理它。由于Javascript(主要)是单线程的,异步执行成为任何应用程序的重要工具。
一个更好的解决方案是将模板嵌入托管HTML页面内容中,或使用JS模块化技术(RequireJS、CommonJS等)将模板与需要它的模块有效地打包。
看起来事件字符串设置正确,呈现函数正在做正确的事情。我看到的一个问题是,根据Backbone View Extend文档,"initialized"函数应该是"initialize"。
参考:http://backbonejs.org/#View-扩展
- 从控制器返回后Ajax启动事件激发
- 触摸启动事件未在iframe iOS 6中启动
- preventDefault之后的重新启动事件
- 如何获取在一系列事件中启动事件的元素
- 当窗口打开时,IE9在加载前启动事件
- 我的 JS 代码中的会话启动事件
- 仅当前一个事件完全完成时,才启动事件
- jQuery UI - 如何区分拖动/调整大小启动事件和单击事件
- Javascript “卡住”键(未注册的键启动事件)
- pace.js:“启动”事件未触发
- 在第一次触摸启动事件时禁用所有点击事件是个好主意吗?
- 如何将“拖动启动”事件与 CKEditor 实例分离
- 触摸启动事件上的Javascript触发函数
- 绑定到触摸启动事件,导致自动对焦集中在Mobile Safari中的任何单击上
- 触摸启动事件未在原来隐藏的按钮上工作
- 有没有一种方法可以使触摸启动事件不会触发点击事件
- 检测浏览器窗口是否处于活动状态,并在窗口再次处于活动状态后启动事件[JavaScript]
- 如何检测浏览器是否支持手势启动事件
- 首先启动事件,然后转到url
- 在IE7中无法捕获鼠标启动事件