【问题标题】:Unable to call a JS function from Typescript in Angular 13无法从 Angular 13 中的 Typescript 调用 JS 函数
【发布时间】:2022-01-23 04:57:30
【问题描述】:

我正在尝试从我的一个组件调用以下函数 LoadMultiSelect(),因为我使用的是非 Angular 库:

https://ibnujakaria.github.io/multiple-select-js/

这在控制台中完美运行:

new MultipleSelect('#select-multiple-language', {
  placeholder: 'Select Language'
})

并加载JS组件。

后来,我尝试在 Angular 中添加它,但找不到方法。

我尝试通过两种方式导出 JS 函数:

export default function LoadMultiSelect() {
  new MultipleSelect('#select-multiple-language', {
    placeholder: 'Select Language'
  });
}

像这样:

LoadMultiSelect() {
  new MultipleSelect('#select-multiple-language', {
    placeholder: 'Select Language'
  });
}

var multiselect = new LoadMultiSelect();

export { multiselect };

我创建了一个文件来加载导出的函数:

assets/js/multiselect.js

后来,我在angular.jsonscripts 部分的build 中添加了它,如下所示:

"scripts": [
              "./node_modules/multiple-select-js/dist/js/multiple-select.js",
              "src/assets/js/multiselect.js"
            ]

然后我尝试像这样将它添加到我的组件中:

import LoadMultiSelect from '../../../../../assets/js/multiselect';

import LoadMultiSelect from 'src/assets/js/multiselect';

但没有任何效果,我收到此错误:

找不到模块的声明文件 '../../../../../assets/js/multiselect'。 '/Users/fanmixco/Documents/GitHub/holma-bootstrap/src/assets/js/multiselect.js' 隐式具有“任何”类型。

或者其他人,知道我做错了什么吗?

附:

  1. 另外,我尝试使用require,但也失败了。

  2. 我已经用旧版本的 Angular 测试过以前的解决方案:

【问题讨论】:

  • 如果您打算关闭它,请告诉我 Angular 6 或更早版本如何兼容。
  • “我将它添加到我的 angular.json 脚本部分的构建中,如下所示:“src/assets/js/multiselect.js”“ 为什么?去掉它。这没有道理。通过猜测进行编程是行不通的。第二个 sn-p 不是有效的 JavaScript/TypeScript。
  • 整个方法看起来很奇怪。这种方法有原因吗? MultipleSelect 是什么?为什么使用扩展名*.js
  • 嗨@jabaa,我有一个必须从我的组件调用的非Angular JS 库。这是主要挑战。
  • 这个库是否已经存在?是否包含像第二个 sn-p 这样的无效代码?

标签: javascript angular angular13


【解决方案1】:

我刚刚在我的本地系统中尝试过这个,有一些如下所示的随机文件,

export function MultipleSelect(val1, val2){
    console.log('Be awesome always', val1, ' and ', val2);
}

现在我像这样在我的组件中导入它,

export class AppComponent {
    title = 'stackoverflow-examples';
    declare MultipleSelect: any;

    constructor(
      private fb: FormBuilder
    ) {
    }

    ngOnInit() {
      import('./someRandomFile').then(randomFile=>{
        randomFile.MultipleSelect('one', 'two')
      });
    }
}

为了将此文件导入到 Angular ts 文件中,我必须允许它在 tsconfig.json 中通过允许 js 导入,如下所示,

"allowJs": true

在下面的控制台中查看结果,

注意:如果无法从 node_modules 加载文件,请将其放在常规文件夹中,如 asset 并按照建议进行导入

【讨论】:

  • 我一直面临:未捕获的 SyntaxError: Unexpected token 'export'
  • 另外,它似乎完全跳过了这个库:"./node_modules/multiple-select-js/dist/js/multiple-select.js" 任何想法?
  • 我在使用 js 库时遇到了同样的情况,我将库从 nodemodules 中排除,因为将来不需要升级/更新它,但我们的功能依赖于它,所以从那里删除它并将其保存在文件夹等资产中并导入
  • 成功了。您可以将其添加到您的答案中吗?然后,我会接受它,因为这是一个棘手的话题。谢谢!
  • 这个话题非常棘手,甚至尝试关闭两次,当这是 Angular 13 中的一个真正问题时,甚至得到了 -1 票。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多