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

时间:2018-11-13 15:09:50

标签: javascript angular html5 photoeditorsdk

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

我尝试使用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标记本身如下所示-基本上会附加一个图像,该图像将显示在编辑器中以进行编辑等。

<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>的最佳方法-我知道这是最佳实践,但是什么是最佳方法?

1 个答案:

答案 0 :(得分:1)

您的组件具有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'
  }
}