管理“;这个“;在事件/回调驱动的JavaScript应用程序中
Managing "this" in event/callback driven JavaScript applications
我想知道在jQuery和Backbone.js 等框架中经常使用的回调中处理"this"引用的预期方法是什么
以下是我遇到问题的简化示例,使用Backbone.js和jQueryUI,但它并不是真正针对这些框架的。
var MyView = Backbone.View.extend({
render: function() {
$('#mybutton').click(function() {
// My code in here
});
},
callMe: function() {
alert('Rawr!');
}
});
现在,我该如何从点击处理程序中引用MyView的实例呢?例如,如何从单击处理程序内部调用"callMe"?在处理程序之外,我只调用this。callMe();但是"this"被click处理程序中的DOM元素所取代。解决这一问题的最佳方法是什么?
最有效的方法是将this
的结果存储在另一个变量中,然后在回调中使用;
var MyView = Backbone.View.extend({
render: function() {
var that = this;
$('#mybutton').click(function() {
// use that for MyView and this for the DOM element
});
},
callMe: function() {
alert('Rawr!');
}
});
或者,您可以使用jQuery.proxy()
或HTML5(注意向后兼容性)Function.prototype.bind()
方法来定义this
的值。显然,您将失去使用this
引用DOM元素的能力,因此必须依赖Event
对象的target
属性;
var MyView = Backbone.View.extend({
render: function() {
$('#mybutton').click((function(e) {
// Use `this` for MyView and `e.target` for the DOM element
}).bind(this));
},
callMe: function() {
alert('Rawr!');
}
});
或者:
var MyView = Backbone.View.extend({
render: function() {
$('#mybutton').click(jQuery.proxy(function(e) {
// Use `this` for MyView and `e.target` for the DOM element
}, this));
},
callMe: function() {
alert('Rawr!');
}
});
我就是这么做的。events
属性是将大多数事件处理程序列在一个位置的简单方法。_.bindAll(this)
将使this
引用所有MyView
函数内部的视图。
var MyView = Backbone.View.extend({
events: {
'click #mybutton': 'clickHandler'
},
initialize: function() {
_.bindAll(this);
}
render: function() {
},
clickHandler: function() {
this.callMe();
},
callMe: function() {
alert('Rawr!');
}
});
相关文章:
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 如何远程检查JavaScript应用程序的函数调用堆栈
- Windows 8 Javascript应用程序XML对象
- 将javascript应用程序迁移到使用AMD的提示(例如requirejs)
- 如何使用原型继承编写一个整洁灵活的复杂javascript应用程序
- 我如何知道js文件之间的javascript应用程序代码流
- PHP文件没有't从Javascript应用程序获取$_POST
- 在Windows Metro风格的Javascript应用程序中读取文件内容
- 在前端javascript应用程序中使用DI容器有意义吗
- 将一个主要网站转换为javascript应用程序
- 应该如何将密码从纯html/javascript应用程序发送到php页面
- 集成多个JavaScript应用程序
- Windows 8 HTML5 JavaScript 应用程序中向左滑动的事件名称是什么
- 用于组织大型javascript应用程序的工具和最佳实践
- Meteor(JavaScript应用程序平台)|向用户帐户添加数据
- 有没有一种方法可以在IE8中解决我的Rails javascript应用程序.js的问题
- Javascript应用程序作为具有外部依赖关系的AMD模块
- 如何从我的HTML/JavaScript应用程序中引用jQuery
- 基于Rails的javascript应用程序的安全性:如何在渲染的javascript中验证用户的权限
- 使用ajax的javascript应用程序的身份验证模型