将脚本标记插入 Angular 4 HTML 组件

Insert script tag into Angular 4 HTML Component

我正在尝试从该网站实施 HTML5 版本的 PhotoeditorSDK - https://docs.photoeditorsdk.com/guides/html5/v4/introduction/getting_started

我尝试使用 Angular Github repo 来实现,但似乎 package.json 说明这仅适用于 Angular 5 和 6,我们的应用程序目前有点过时 Angular 4.x(而且我们现在不能升级到5)

在简单的应用程序中使用 HTML5 方法相当容易,但在 Angular 4 中这似乎很棘手,因为 Angular 限制我无法使用 <script> 组件内的标签。

在索引 <head> 中我添加了以下内容:

<head>
  <!-- React Dependencies for the SDK UI -->
  <script src="js/vendor/react.production.min.js"></script>
  <script src="js/vendor/react-dom.production.min.js"></script>
  <!-- PhotoEditor SDK-->
  <script src="js/PhotoEditorSDK.min.js"></script>
  <!-- PhotoEditor SDK UI -->
  <script src="js/PhotoEditorSDK.UI.DesktopUI.min.js"></script>
  <link rel="stylesheet" href="css/PhotoEditorSDK.UI.DesktopUI.min.css"/>
</head>

在模板本身中有一个简单的 <div> 如下:

<div id="editor" style="width: 100vw; height: 100vh;"></div>

脚本标签本身如下所示 - 基本上会附加一张图像,该图像会在编辑器中显示以进行编辑等。

<script>
  window.onload = function () {
    var image = new Image()
    image.onload = function () {
      var container = document.getElementById('editor')
      var editor = new PhotoEditorSDK.UI.DesktopUI({
      container: container,
      // Please replace this with your license:    https://www.photoeditorsdk.com/dashboard/subscriptions
    license: '{"owner":"Imgly Inc.","version":"2.1", ...}',
    editor: {
      image: image
    },
    assets: {
      // This should be the absolute path to your `assets` directory
      baseUrl: '/assets'
    }
   })
  }
    image.src = './example.jpg'
}
</script>

我正在尝试找出直接在 Angular 4 组件中使用上述 <script> 的最佳方法 - 我知道这是最佳做法,但最好的方法是什么?

您的组件有一个 ID 为 editor 的元素。这仅在组件的 ngAfterViewInit 挂钩中可用。一旦这个被调用,window.onload 很久以前就被调用了。此外,当 onload 被调用时,该元素根本不存在,所以将它放在那里也是一个坏主意。

最好是从组件的 ngAfterViewInit 内部调用该方法,并使用 @ViewChild 注释:

declare const PhotoEditorSDK: any;

@Component({
  template: `<div style="width: 100vw; height: 100vh;" #editor></div>`
})
export class EditorComponent implements AfterViewInit {

  @ViewChild('editor') editor: ElementRef<HTMLElement>; 

  ngAfterViewInit(): void {
    const image = new Image();
    image.addEventListener('load', () => {
      const editor = new PhotoEditorSDK.UI.DesktopUI({
        container: this.editor.nativeElement,
        license: '{"owner":"Imgly Inc.","version":"2.1", ...}',
        editor: {
          image
        },
        assets: {
          baseUrl: '/assets'
        }
      });
    });

    image.src = './example.jpg'
  }
}