2016-06-10 1 views
1

У меня есть тип общественной машинописи так:машинопись обратного вызова внешнего файл привязка «это» ключевым словом

export class Generator { 

    public generate(settings: GeneratorSettings): void { 

     $('#' + settings.Id+ "").dataTable({ 
      dom: 'RC<"clear">rti<"bottom"pl>', 
      sAjaxSource: settings.sourceUrl, 
      bServerSide: true, 
      pageLength: 15, 
      lengthMenu: [15, 25, 50, 100], 
      fnDrawCallback: (oSettings) => { this.internalCallback(oSettings); settings.publicCallback(); } 
     }); 
    } 

    private internalCallback(oSettings: any) { 
     // Do work 
    } 

В этом случае я использую библиотеку третьей стороны (JQuery DataTables), который обеспечивает функцию обратного вызова. Чтобы пользователи, использующие этот тип позже, подключались к событиям, я включил в свои настройки общедоступное свойство publicCallback, которое пользователи этого типа могут установить в свою собственную функцию.

Одним из примеров publicCallback используется это:

В HTML инлайн сценарий у меня есть:

settings.publicCallback = externalModule.initialise; 

Где externalModule является экземпляром другого типа машинопись следующим образом:

export class ExternalModule { 

    public initialise() { 

     // Various things happen before here 

     $("#button").on("click", (event) => { 
      this.buildIdList(event); 
     }); 
    } 

    private process(event: any){ 

     // Doing work 

    } 

Моя проблема заключается в функции ExternalModule.initialise. Поскольку он вызывается из другого модуля TypeScript, ключевое слово this в этой точке является параметром settings, на котором существует свойство publicCallback.

Я прочитал ключевое слово this, и я понимаю, почему это происходит, однако я не могу найти способ обойти его. Я пытался делать следующее в Generator типа:

fnDrawCallback: (oSettings) => { this.internalCallback(oSettings); settings.publicCallback.bind(settings.publicCallback)(); 

Но это делает не поможет, так как теперь this ключевых слов точек на только методом initialise.

+0

Когда у вас есть доступ к этому, вам нужно сохранить его в переменной и получить доступ к этой переменной – 2426021684

+0

У меня никогда не возникает проблемы с этим контекстом, который я хочу. Как только вызывается функция 'initialize',' this' имеет контекст параметра 'settings' - нет возможности зафиксировать правильный контекст. – FLSH

ответ

1

Вы можете использовать функцию Function.prototype.bind следующим образом:

settings.publicCallback = externalModule.initialise.bind(externalModule); 

Это сохранит объем externalModule как this объекта, а затем ваша стрелка функция обратного вызова будет иметь правильную this, а также.

+0

Спасибо, это то, что я искал. Есть ли какой-нибудь способ, которым вы можете думать о том, чтобы поместить это в тип «Генератор», чтобы сохранить потребление обратного вызова простым или это невозможно, насколько вам известно? – FLSH

+0

Вам нужен экземпляр 'externalModule' для привязки или применения/вызова его метода' 'initialise', но (насколько я знаю) у вас нет экземпляра при выполнении функции' Generator.generate' , Вы также можете передать экземпляр в настройках, а затем вы сможете: 'settings.publicCallback.bind (settings.publicCallbackThis)', но это будет странно, так как вы можете просто передать привязанную функцию к настройкам начните с (как я это сделал в своем ответе). –