无法在Angular模块中加载.js文件

时间:2020-06-09 15:40:49

标签: javascript angular

我有一个使用本地脚本sidebar.js的侧边栏Angular组件。在src \ app \ sidebar \ sidebar.component.ts中,我尝试按以下方式加载sidebar.js:

  ngAfterViewInit(): void {
    const s = document.createElement('script');
    s.type = 'text/javascript';
    s.src = 'src/app/sidebar/sidebar.js';
    console.log('creating external script: ' + s.src);
    this.elementRef.nativeElement.appendChild(s);
  } 

我收到此错误:
http://localhost:4201/src/app/sidebar/sidebar.js net :: ERR_ABORTED 404(未找到)

是的,我在angular.json中也有这行:

        "scripts": [
...
          "src/app/sidebar/sidebar.js"
        ]

以下代码也失败了,并显示404:

s.src = 'sidebar.js';

不幸的是,由于侧边栏组件位于我为客户构建的Angular模块中,因此无法按照My Local JavaScript file is not loaded in Angular 2中的建议将sidebar.js放在/ assets中。 / assets目录位于我的客户的代码中。另外,sidebar.js包含以下逻辑:

const _R = document.querySelector('[type=range]');
_R.style.setProperty('--val', +_R.value);
_R.style.setProperty('--max', +_R.max);
_R.style.setProperty('--min', +_R.min);

取决于sidebar.component(位于我的模块中):

  <input
    class="border-0 slider"
    type="range"
    min="10"
    [title]="scale"
    step="5"
    [(ngModel)]="scale"
    max="200"
    orient="vertical"
    list="tickmarks"
  />

是的,我知道许多类似的问题被问到并回答了:
angular2: including thirdparty js scripts in component
script tag in angular2 template / hook when template dom is loaded

但是它们都没有解决sidebar.js和index.html位于两个不同模块中的问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的脚本片段不“依赖”示例片段中的组件。您正在整个网页(文档的根目录)中请求任何类型为“范围”的输入,而这不一定是您的组件。 (如果页面中有10个input[type="range"],则脚本必须以某种方式处理该脚本,否则它将仅获取第一个脚本。)

执行您要执行的操作的方法是将其放入资产文件夹中。如果任何项目规则都禁止这样做,则有两种选择:

  1. 将sidebar.js文件上传到其他服务器或其他路径,并从那里托管它。由于似乎您无法控制客户服务器中的文件,因此无法假设存在/src/app/目录(因为在构建应用程序后无需运行该应用程序)

  2. 将您的.js文件转换为打字稿文件(.ts)并导入,以便打字稿可以对其进行编译。

要将其转换为.js文件,只需将文件重命名为sidebar.ts,然后在要包含它的文件上将import for side effects only

我建议您将文件包装在一个可调用函数中,该函数将组件引用作为参数接收,以便您可以指定与之相关的元素,而不是让它在文档根目录中找到,但我怀疑这样做会涉及弄乱sidebar.js文件的内部。但是,如果侧边栏文件是库或模块,则可能会很耗时。

相关问题