我正在处理有关对象内部Ajax回调的问题。请考虑以下代码:
Search.prototype =
{
ask : function( query )
{
// Display loader
$('.loader').show();
$.ajax({
dataType : 'jsonp',
type : 'GET',
url : 'http://api.deezer.com/search/track/',
data : {
output : 'jsonp',
q : query
}
}).done(function(res) {
this.loadResults( res );
// [Error] Object success has no method 'loadResult'
});
},
loadResults : function (res)
{
// Hide loader
$('.loader').hide();
console.log( res );
// doing some stuff
// ...
}
}
var search = new Search();
search.ask( 'eminem' );
我收到一个错误Object success has no method loadResult
,这很有意义,因为回调是匿名jQuery函数的一部分。
但是如何获取我的初始对象实例?
我一直在尝试一个var = this; 在Ajax调用之前,但出于相同的原因我将无法使用。
我不知道是否可能这样做,或者问题是否出在我的代码全球组织。随时向我建议最佳做法:)
预先感谢。
我混淆了代码中的某些内容,尽管没有必要在此处发布,但最终我在代码中更早地发现了问题。对于那个很抱歉。
这是我的完整代码,现在可以使用:
define(['jquery'], function($) {
var Search = function()
{
this._keyDownTimer = 0;
this._searchDelay = 1000; // ms
};
Search.prototype =
{
// The init function that I though it was unnecessary to post here. Sorry :/
init : function()
{
$('#q').on('keydown', (function(evt) {
clearTimeout( this._keyDownTimer );
this._keyDownTimer = setTimeout( (function() {
this.ask( $('#q').val() );
}).bind( this ), this._searchDelay); /* <-- Here's the solution.
I forgot to bind `this`
to the timeout callback function,
so the `this` under all of my code
was referring to the anonymous function
of this callback. */
}).bind( this ));
},
ask : function( query )
{
// Display loader
$('.loader').show();
console.log(this); // Now `this` refers to my object :)
var req = $.ajax({
dataType : 'jsonp',
type : 'GET',
url : 'http://api.deezer.com/search/track/',
context : this,
data : {
output : 'jsonp',
q : query
}
});
req.done(function(res) {
this.loadResults(res);
});
},
loadResults : function (res)
{
// Hide loader
$('.loader').hide();
// doing some stuff
// ...
}
};
return new Search;
});
感谢您的答复,它确实有所帮助。
铅解决了。
有几种方法可以做到这一点。
您可以设置context
ajax选项的设置:
jQuery.ajax
context
设置$.ajax({
context: this
Function.prototype.bind
](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
.done(function (res) {
}.bind(this));
但是,它没有像…那样得到广泛的支持。
jQuery.proxy
为此创建的。
.done($.proxy(function (res) {
}, this);
var self = this;
$.ajax({
/* snip */
.done(function (res) {
self.loadResults(res);
这通常是在JavaScript中完成的,以便this
在较低范围内进行访问。
$.ajax({
/* snip */
.then(res => this.loadResults(res));
问题内容: 我有一个注册事件处理程序的构造函数: 但是,我无法在回调内部访问已创建对象的属性。看起来好像不引用创建的对象,而是引用另一个对象。 我也尝试使用对象方法而不是匿名函数: 但是也有同样的问题 如何访问正确的对象? 问题答案: 你应该知道什么 (又名“上下文”)是每个功能内的特殊关键字和它的值仅取决于 如何 调用函数,而不是如何/何时/何它被定义。它不受其他变量之类的词法作用域的影响(箭头
问题内容: 看来我无法访问jquery ajax成功函数内的$(this)。请参见下面的代码。 问题答案: 应该怎么办 如果在该函数之外有对它的引用,则可以将其存储到变量中。
问题内容: 我正在为网站进行股票交易所jQuery修复。 编辑:它根据返回的值更新网页上的ID / CLASS或输入值。 index.php: 目前它正在返回: 我也尝试过使用.text()将其返回到div demo.json: 请有人能告诉我我做错了什么。 提前致谢! 问题答案: 你可以这样做: 所以这里的主要问题是: 正如ajax一样,您需要执行ajax成功回调中的所有逻辑,并且始终会获得&变
问题内容: 当我使用jQuery进行Ajax请求时,是否可以查看请求的URL? 例如, 如何访问jQuery实际用于发出请求的URL?也许某种方法/属性?我在文档中找不到它。 谢谢。 问题答案: 在成功方法中设置一个断点,然后观察 是请求的真实网址。
问题内容: 我有以下课程片段: 我无法获得设置的超时值以从事件中打印值,我应该做些什么,但我不是吗? 问题答案: SyntheticEvent 。 根据 DOC : SyntheticEvent已合并。这意味着在调用事件回调之后,将重新使用SyntheticEvent对象,并且所有属性都将无效。这是出于性能原因。 例: 如何访问回调中的值? 将值存储在变量中: 如果要在超时回调函数中访问该值,则将
今天早些时候,我问了一个关于使用ZenDesk API进行ajax调用的问题。 我可以在命令提示符下成功运行以下命令,并在ZenDesk中创建一个票证(是api令牌字符串): 我现在试图理解的是如何将其转换为ajax调用。这是我下面的文档。 我目前正在做的事情如下: 以下是我已经看过的一些答案和文档,但我仍然很困惑: (最佳之一):https://auth0.com/blog/using-json