鉴于此代码,
var submit = { send:function (form_id) { var url = $(form_id).attr("action"); $.ajax({ type: "POST",url: url,data: $(form_id).serialize(),dataType: 'json',success: function(result) { this.ret(result.message); },error: function(result) { // Some error message } }); },ret:function (result) { this.result_data = result; },result_data:"" };
将从表单发送数据到控制器,如果将返回一个json
$result['message'] = validation_errors(); echo json_encode($result);
var res = submit.send(form_id);
其中form_id是表单id,并使用查找输出
console.log(res);
在控制台中,它显示未定义.在使用google和stackoverflow本身搜索解释后,我明白了,
this.ret(result.message);
在ajax中被调用,这是另一个对象,表明它不是它的方法的一部分.
有人能向我解释一下吗?
解决方法
有几种方法可以解决它.
一个是ES5兼容(这实际上是非常常见的模式):
var submit = { send: function (form_id) { var url = $(form_id).attr("action"); var self = this; // << this is binded to self varialble $.ajax({ type: "POST",success: function(result) { self.ret(result.message); // << replaced this to self so it has all the methods from the submit object. },error: function(result) { // Some error message } }); },ret:function (result) { this.result_data = result; },result_data:"" };
另一个是使用ES2015中的箭头函数加$.ajax返回的延迟对象:
var submit = { send: function (form_id) { var url = $(form_id).attr("action"); $.ajax({ type: "POST",dataType: 'json' }) .then((result) => { this.ret(result.message); // << arrow function is called in context of the parent function,so no needs to change anything. }) .fail(function(result) { // Some error message }); },result_data:"" };
说明:回调函数中的this的上下文将绑定到全局作用域而不是对象的作用域.所以你需要以某种方式改变它.
您实际上可以匹配并混合这两种方法.
您还可以使用bind或put success作为对象方法.正如其他答案所述.同样的事情,你想把它保持为对象的上下文.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。