TypeScript回调到外部文件绑定"这个"关键词

时间:2016-06-10 15:38:43

标签: typescript this

我有这样的公共打字稿类型:

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是另一种TypeScript类型的实例,如下所示:

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方法,因此无效。

1 个答案:

答案 0 :(得分:1)

您可以使用Function.prototype.bind功能,如下所示:

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

它会将externalModule的范围保存为this对象,然后您的箭头函数回调也将具有正确的this