Angular 2 typescript调用 javascript 函数

IT技术 javascript angular typescript
2021-02-24 06:23:58

是否有从 Angular 2 (TypeScript) 中的组件调用 JavaScript 函数的正确方法?

这是我的组件:

import { ElementRef, AfterViewInit }       from '@angular/core';

export class AppComponent implements AfterViewInit {

    constructor(private _elementRef: ElementRef) {
    }

    ngAfterViewInit() {
        /**
         * Works but i have this error :
         * src/app.component.ts(68,9): error TS2304: Cannot find name 'MYTHEME'.
         * src/app.component.ts(69,9): error TS2304: Cannot find name 'MYTHEME'.
         */
        MYTHEME.documentOnLoad.init(); 
        MYTHEME.documentOnReady.init();

        /**
         * Works without error, but doesn't seem like a right way to do it
         */
        var s = document.createElement("script");
        s.text = "MYTHEME.documentOnLoad.init(); MYTHEME.documentOnReady.init();";
        this._elementRef.nativeElement.appendChild(s);
    }
}

直接调用 JavaScript 函数会导致编译错误,但“已编译”的 JavaScript 文件(app.component.js)中的语法是正确的:

AppComponent.prototype.ngAfterViewInit = function () {
    MYTHEME.documentOnLoad.init();
    MYTHEME.documentOnReady.init();
};

第二种方式 (appendChild) 可以正常工作,但我认为(从 typescript/angular 更改 DOM)不是正确的方法。

我发现了这一点:使用 Typescript 中的 Javascript 函数我尝试声明接口:

interface MYTHEME {
    documentOnLoad: Function;
    documentOnReady: Function;
}

但是 TypeScript 似乎无法识别它(接口声明中没有错误)。

谢谢

编辑 :

按照胡安·门德斯的回答,这就是我的结尾:

import { AfterViewInit }       from '@angular/core';

interface MYTHEME {
    documentOnLoad: INIT;
    documentOnReady: INIT;
}
interface INIT {
    init: Function;
}
declare var MYTHEME: MYTHEME;

export class AppComponent implements AfterViewInit {

    constructor() {
    }

    ngAfterViewInit() {
        MYTHEME.documentOnLoad.init(); 
        MYTHEME.documentOnReady.init();
    }
}
1个回答

您必须使用declare. https://www.typescriptlang.org/docs/handbook/writing-declaration-files.html

interface MyTheme {
    documentOnLoad: Function;
    documentOnReady: Function;
}
declare var MYTHEME: MyTheme;

或匿名

declare var MYTHEME: {documentOnLoad: Function, documentOnReady: Function};
@MBalajivaishnav 我的答案不是您提出无关问题的地方。请删除此评论并添加一个新问题,我们不会在此处回收问题,以便每个问题都有自己的帖子,以便对其他人最有用。
2021-04-21 06:23:58
@JuanMendes Joshua 接受了您的回答,这意味着它对他有用,所以我认为他是提出疑问的合适人选,我没有向他询问任何代码片段,而是怀疑将 js 文件导入 angular 2 typescript文件并为它创建界面,所以我让他详细说明一下,我希望你知道 StackOverflow 规则,如果我问同样的问题,它会被再次复制重定向到这个问题,而不是我直接在这里问我不在这找不到任何问题
2021-04-28 06:23:58
@Joshua 你能详细说明一下这些步骤吗,因为我是 typescript 的新手,希望从组件内的外部 js 文件调用一个 js 函数
2021-05-02 06:23:58
@MBalajivaishnav 即使您不想创建新帖子,我的答案也不是您向 Joshua 提问的地方。他的帖子已经展示了如何从 TS 调用 JS 函数。如果您仍然无法让您的代码工作,那就是另外一回事了。再次,请创建您自己的问题,显示您的尝试。SO 不是要求提供代码示例。这是为了“我试过这个(显示代码),但它没有用。这是它所做的,这是错误消息”。您无法通过评论传达该信息。
2021-05-03 06:23:58
@JuanMendes 不是问任何不相关的问题,而是要求详细说明步骤,如果我确实问了一个重复的新问题,希望您理解
2021-05-04 06:23:58