2016-06-10 6 views
1

ich wie so öffentlich Typoskript Typ haben:Typoskript Rückruf an externe Datei Bindung „dieses“ Schlüsselwort

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 
    } 

In diesem Fall habe ich einen Dritten Bibliothek bin mit (jQuery Tables), die eine Callback-Funktion zur Verfügung stellt. Damit Benutzer, die diesen Typ später verwenden, sich in die Ereignisse einklinken können, habe ich eine öffentliche publicCallback -Eigenschaft in meine Einstellungen aufgenommen, die diese Art von Benutzern für ihre eigene Funktion festlegen können.

Ein Beispiel für die publicCallback verwendet wird, ist dies:

In einem HTML-Inline-Skript habe ich:

settings.publicCallback = externalModule.initialise; 

Wo externalModule eine Instanz einer anderen Typoskript Typ ist wie folgt:

export class ExternalModule { 

    public initialise() { 

     // Various things happen before here 

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

    private process(event: any){ 

     // Doing work 

    } 

Mein Problem liegt in der ExternalModule.initialise Funktion. Das this Schlüsselwort an diesem Punkt ist der settings-Parameter, auf dem die publicCallback-Eigenschaft vorhanden ist, wie es von dem anderen TypeScript-Modul aufgerufen wird.

Ich habe auf dem Stichwort this nachgelesen und ich verstehe, warum das passiert, aber ich kann einen Weg darum nicht finden. Ich habe in dem Generator Typ folgend versuchte dabei:

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

Aber das macht, ist keine Hilfe, wie jetzt die this Stichwort Punkte bei nur die initialise Methode.

+0

Wenn Sie Zugang zu diesem haben, müssen Sie es in einer Variablen speichern und auf diese Variable zugreifen – 2426021684

+0

Ich habe nie ein Problem mit dem 'diesen' Kontext, den ich will. Sobald die 'initialize'-Funktion aufgerufen wird, hat 'this' einen Kontext des 'settings'-Parameters - es gibt keine Möglichkeit, den richtigen Kontext zu erfassen. – FLSH

Antwort

1

können Sie die wie so Function.prototype.bind Funktion:

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

Es wird den Umfang der externalModule als this Objekt speichern, und dann wird Ihr Pfeil Callback-Funktion die richtigen this sowie haben.

+0

Danke, das ist, was ich gesucht habe. Gibt es eine Möglichkeit, dies in den 'Generator'-Typ zu bringen, um den Verbrauch des Callbacks einfach zu halten, oder ist das nicht möglich, soweit Sie wissen? – FLSH

+0

Sie benötigen die Instanz des 'externalModule', um die' 'initialise' 'Methode zu binden oder anzuwenden/aufzurufen, aber (soweit ich weiß) haben Sie nicht die Instanz, wenn Sie die' Generator.generate' Funktion ausführen . Sie können die Instanz auch in den Einstellungen übergeben, und dann können Sie: 'settings.publicCallback.bind (settings.publicCallbackThis)' aber das wird komisch sein, da Sie eine gebundene Funktion nur an die Einstellungen übergeben können Beginne mit (wie ich es in meiner Antwort getan habe). –

Verwandte Themen