【问题标题】:Angular4 - Use a function inside a JavaScript fileAngular4 - 在 JavaScript 文件中使用函数
【发布时间】:2018-05-25 09:55:03
【问题描述】:

我正在尝试将 JavaScript 文件加载到我的 Angular 组件中。我已经从这里加载了完整的缩小版本:https://github.com/blueimp/JavaScript-Load-Image/blob/master/js/load-image.all.min.js 并将所有相关脚本放在我的脚本文件夹中。

当代码运行并到达'loadImage'时,控制台会触发错误:

ERROR ReferenceError: loadImage is not defined

解决这个问题的最佳方法是什么?

组件

import '../../../assets/scripts/load-image.all.min.js';
declare var loadImage: any;

...

dropChangeHandler(e) {
   e.preventDefault()
   e = e.originalEvent
   var target = e.dataTransfer || e.target
   var file = target && target.files && target.files[0]

   var options = {
     maxWidth: 1000,
     maxHeight: 1000,
     canvas: true,
     pixelRatio: window.devicePixelRatio,
     // downsamplingRatio: 0.5,
     orientation: true
   }
   if (!file) {
     return
   } else {

   this.currentFile = file;   
   if (!loadImage(file, this.updateResults, options)) {

   }

  }
}

我认为这个问题与其他“将 JS 文件导入 Angular”略有不同,因为我觉得这可能与我尝试导入的库有关。但是,我不确定并就此寻求建议。

【问题讨论】:

标签: javascript angular import referenceerror


【解决方案1】:

您尝试导入的库不支持 es6 模块。由于库中没有导出,因此它不会在导入后将任何变量添加到您的作用域中。

在您的特定情况下,最简单的方法是将脚本添加到 index.html:

<script src="assets/scripts/load-image.all.min.js"></script>

并调用组件中的方法

window.loadImage(file, this.updateResult, options)

我使用window,因为库直接将自身绑定到 window.object


更多详情

  • 要将 javascript 模块与 typescript 一起使用,请将 allowJs: true 添加到 tsconfig.js 文件中。

  • import './file 被称为仅用于副作用的导入,不会更改模块的范围,但可以访问全局应用程序范围。如果您想扩展已导入的模块,它可以为您提供帮助。

  • 您可以通过不同的方式导入 js 模块:

    • 对于 CommonJs 模块,可以在您的 component.ts 文件中使用 import * as ModuleName from './modulePath.js'; 并调用 ModuleName.exportedMethod()

    • 到 Angular 管道,以确保它加载了模块 进口它。如果您使用的是 Angular cli,只需将其包含在您身上 应用程序/脚本部分中的 angular-cli.json:

      {
        "apps":
           ...
           "scripts": [
               "assets/scripts/load-image.all.min.js"
           ]
      }
      
    • 如果你不使用 angular-cli,你可以在你的index.html 中包含: <script src="assets/scripts/load-image.all.min.js"></script>

【讨论】:

  • 太棒了。不知道你能做到这一点。当我更改为上述内容时,发生了几件事。 Visual Code 指出文件“已从 '...' 解析为 '..' 但未设置 '--allowJs'”。 - 无论如何它都会编译。在浏览器中,我运行代码,现在得到“LoadImage.loadImage 不是函数” - 我在这里遗漏了什么明显的东西吗?为了澄清,我删除了 angular-cli.json 文件中的任何引用,并且刚刚实现了上述内容。再次感谢尤金!
  • 我刚刚看到您更新的评论。我删除了组件导入并将脚本添加到 angular cli 文件中。那是对的吗?还是我两者都需要?如果我两者都有,则无法编译。如果我只有在 angular-cli 中的引用,我该如何在组件文件中调用它?感谢您的时间! :)
  • 你说得对,谢谢指正!您只能以一种方式导入它,不能同时导入。我会更正答案。
  • 谢谢尤金。我对发生的事情有点困惑。如果我在索引文件或 angular-cli 中包含脚本,浏览器控制台将抛出错误:“未捕获的 ReferenceError:未定义要求”。但是,如果我将文件导入到我的 component.ts 文件(不是模块)中,然后将该函数引用为 Loadimage.loadImage,它会声明“LoadImage.loadImage 不是函数”。有什么想法吗?
  • 你把--allowJs 添加到你的 tsconf 就好了。我刚刚意识到您的库只是不使用任何值将 loadImage 函数直接导出和绑定到窗口对象。
【解决方案2】:

我认为您需要在导入的文件中导出所需的功能。

【讨论】:

  • 感谢 Bernd 的回复。道歉。对此很陌生。您指的是“load-image.all.min.js”文件吗?如果是这样,您如何设置导出?
【解决方案3】:

您必须不确定该库是否会被编译 在 angular-cli.json 中添加脚本

"scripts": [
....
'<path to file>/assets/scripts/load-image.all.min.js'
....
]

然后

declare var loadImage: any;

【讨论】:

  • 谢谢 Segito - 我也试过这个。解决方案编译,但浏览器控制台显示 'Uncaught ReferenceError: require is not defined'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2019-02-04
  • 2015-07-02
  • 2017-08-24
相关资源
最近更新 更多