Подтвердить что ты не робот

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 в области видимости.

4b9b3361

Ответ 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);
    };
}