2013-03-27 3 views
10

Я портирую код javascript на машинописный текст, и я столкнулся с проблемой.Typcript + Jquery Ajax + this

У меня есть вызов 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); 
    }; 
} 

Теперь, когда вы видите, что прокси-сервер отказа вызывает локальный метод, а также использование этого «контекстного объекта». Итак, как вы можете справиться с подобным сценарием с машинописным текстом?

Можете вы только что установить self = this в конструкторе и продолжить то, что было раньше?

== EDIT ==

В соответствии с просьбой здесь класс представление выше, показывающий вопрос об этом необходимости быть 2 вещи из-за отсутствующей переменной самостоятельно.

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, а затем я могу обойти , который будет переопределен, что необходимо для сохранения объекта состояния aynax async в области видимости.

+0

машинописный сборник этого кода является именно сам этот код, так что вы действительно здесь вопрос JavaScript. Или вы пытаетесь преобразовать это в класс (если да, что у вас есть до сих пор)? –

+0

Это оригинальный javascript, ну это издевавшийся набор javascript, чтобы показать проблему, которая у меня есть. Я буду обновлять с помощью классного типа машинописного текста, если это поможет, хотя я думал, что проблема будет очевидна без него. – Grofit

+0

Это может помочь https://www.youtube.com/watch?v=tvocUcbCupA&hd=1 – basarat

ответ

7

Можете ли вы просто установить 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's tempting! 
      error: function(arg) { self.FailureProxyCallback(this, arg) } 
     }; 

     $.ajax(ajaxSettings); 
    }; 
} 
+0

Похоже на разумное решение, спасибо за советы – Grofit

+6

В чем проблема использования выражения лямбда (функция стрелки)? – Santhos

Смежные вопросы