0

我正在开发我的第一个 jQuery UI 小部件。它使用 $.ajax 来提取数据,然后在加载数据后填充元素。通常我会有一个执行 ajax pull 的函数,并将“onSuccess”回调函数传递给该函数,以便在 ajax pull 成功时执行。

这是我的意思的一个非常简化的版本:

function doAjax(onSuccess) {
    $.ajax({
        success: function (data) {
            onSuccess(data);
        }
    });
}

doAjax(function (data) {console.log(data);});

使用小部件工厂,我知道我可以在 $.ajax 的成功函数中添加触发器。我可以在我的小部件代码中使用该触发器吗?

像这样的东西有效,但似乎不是最佳实践:

_create: function() {
    self.options.dataLoaded = function (e, data) {console.log(data);};
    this._doAjax();
},
_doAjax: function() {
    var self = this;

    $.ajax({
        success: function (data) {
            self._trigger('dataLoaded', null, data);
        }
    });
}

什么被认为是这里的最佳实践?

4

1 回答 1

2

通过做一些试验和错误代码,我确定第一个选项是最好的。这是似乎效果最好的代码的简化版本。

_create: function() {
    var self = this;
    self._doAjax(self.doStuff);
},
_doAjax: function(onSuccess) {
    var self = this;

    $.ajax({
        context: self,
        success: function (data) {
            onSuccess.call(this, data);
            self._trigger('dataLoaded', null, data);
        }
    });
},
doStuff: function(data) {
    var self = this;

    console.log(self);
    console.log(data);
}

这使我可以像往常一样使用回调,并允许我的小部件的用户在dataLoaded需要时使用该事件。$.ajax content:加上选项onSuccess.call(this,data)允许我确保仍然会从用作回调的方法this内部引用我的小部件。doStuffonSuccess

于 2012-11-03T20:30:54.277 回答