jwplayer 在 Angular 元素中表现不佳

jwplayer doesn't play well in Angular Elements

我的这个 Angular 组件带有嵌入式 jwplayer,运行良好。 当我尝试使用 Angular 元素从中创建自定义元素或尝试使用 "encapsulation: ViewEncapsulation.Native" 时,jwplayer 将无法初始化。 jwplayer 已加载,我可以在 window 对象中看到它。

core.js:1604 ERROR TypeError: jwplayer(id).setup is not a function
    at t.setupPlayer (jw-player.js.pre-build-optimizer.js:70)
    at HTMLScriptElement.S (zone.js:1188)
    at t.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.js:4034)
    at t.invokeTask (zone.js:420)
    at e.runTask (zone.js:188)
    at e.invokeTask [as invoke] (zone.js:496)
    at k (zone.js:1540)
    at HTMLScriptElement._ (zone.js:1566)  

原因是加载的库 (https://content.jwplatform.com/libraries/6gLLM4B1.js)。它使用 document.getElementById(...) 查找视频元素,有时也使用 document.body。但是,视频元素是 JwPlayerComponent,如果您在根组件上激活 Shadow DOM,该元素将隐藏在 Shadow DOM 中。

另一方面,您可以使用 ViewEncapsulation.Native 作为 Angular 元素/自定义元素提供它。为了完成这项工作,我不得不对项目进行一些修改:

  • 删除选择器b/c它与自定义元素的名称冲突(// selector: 'wu-player-element')
  • 同时删除模块的 bootstrap 部分 (//bootstrap: [AppComponent])
  • 修改你的 tsconfig.app.json:添加 "target": "es2015", b/c 自定义元素不工作,TypeScript 降级 类 到 ES5

如果你仍然需要 ES5,你可以使用 polyfill (native-shim.js),参见:https://www.softwarearchitekt.at/post/2018/07/13/angular-elements-part-i-a-dynamic-dashboard-in-four-steps-with-web-components.aspx