Typescript + Jquery Ajax + this
Я переношу код javascript на typescript, и я столкнулся с проблемой.
У меня есть вызов ajax, который передает объект в качестве контекста, этот объект содержит некоторые обратные вызовы и некоторую другую информацию, которые считываются с помощью обратных вызовов успеха или ошибок, которые указывают, куда следует перенаправить вызов успеха:
function SomeAjaxService
{
var self = this;
self.CheckErrorType = function(...) {
// Do something
};
var SuccessProxyCallback = function(results) {
// Do some stuff with results, like send off some events
this.successCallback(results);
};
var FailureProxyCallback = function(...) {
// Do some stuff with errors, and fire some events
var someErrorType = self.CheckErrorType(...);
this.failureCallback(someErrorType);
};
self.SendRequest = function(requestArgs) {
var ajaxSettings = {
context: requestArgs,
// Assign a load of stuff
};
$.ajax(ajaxSettings);
};
}
Теперь, когда вы видите, что прокси-сервер отказа вызывает локальный метод, а также использование контекстного объекта "this". Итак, как вы можете справиться с таким сценарием с помощью typescript?
Вы можете просто установить self = this
в конструкторе и продолжить, как раньше?
== EDIT ==
В соответствии с запрошенным здесь представлением класса выше показано, что проблема в том, что это должно быть 2 вещи из-за недостающей переменной self.
class SomeAjaxService
{
public CheckErrorType(someArg1: any, someArg2: any) {
// Do some stuff with data
};
private SuccessProxyCallback(results: any) {
// Do some stuff with results, like send off some events
this.successCallback(results);
// Does the above *THIS* usage point to the context of the
// Ajax call or the actual instantiated class
};
private FailureProxyCallback(...) {
// Do some stuff with errors, and fire some events
var someErrorType = this.CheckErrorType(...);
// The above *THIS* call cannot be correct if the context has overwritten
// the scope of this, however I dont know if this is true, do I even need
// this.CheckErrorType to invoke a local method?
this.failureCallback(someErrorType);
// As mentioned above same issue here but the *THIS* should hopefully
// point to the context object on the ajax object not the local instance.
};
public SendRequest(requestArgs: any) {
var ajaxSettings : JqueryAjaxSettings = {
context: requestArgs,
// Assign a load of stuff
};
$.ajax(ajaxSettings);
};
}
Как я уже говорил выше, основная проблема заключается в том, что в методе мне нужно вызвать один из методов экземпляров, а также вызвать метод для объекта контекста из вызова ajax. С необработанным javascript я бы имел self = this
, а затем я мог бы обойти this
переопределить, что необходимо для сохранения объекта состояния aynax async в области видимости.
Ответы
Ответ 1
Можете ли вы просто установить self = this в конструкторе и продолжить, как раньше?
Говоря абстрактно, это делается в конструкторе, как правило, ничего не решает (если вы не возьмете его позже в этом методе - см. ниже). TypeScript классы хранят данные экземпляра класса класса для самого объекта, а не для захвата локальных жителей. Поскольку self
будет сохранен в объекте this
, вы не получите ничего, что у вас еще не было.
Вот один из способов сделать это:
class SomeAjaxService
{
private FailureProxyCallback(context, arg) {
// now 'this' is the class instance and 'context' is requestArgs
}
public SendRequest(requestArgs) {
var self = this; // Note: captured local used in closure below
var ajaxSettings = {
context: requestArgs,
// Do not use an arrow function here, even though it tempting!
error: function(arg) { self.FailureProxyCallback(this, arg) }
};
$.ajax(ajaxSettings);
};
}