【发布时间】:2018-07-08 21:50:39
【问题描述】:
TL;DR:
我在 iFrame 内的 Angular 5 应用程序中渲染 BioDigital HumanAPI 解剖模型。我使用以下方法实例化 API 对象:
this.human = new HumanAPI(iFrameSrc);
有一个 API 函数 human.on(...) 可用于从 iFrame 中注册点击事件(例如从模型中选取对象等)。我需要这个功能才能随时收听事件。我进行对象实例化并将这个函数放在ngOnInit() 中并且它可以工作,但是当我更改iFrame 的源以呈现不同的模型时,这个函数停止工作。我应该把这个监听函数放在哪里,以便它的逻辑始终可用?
加长版:
我正在使用 BioDigital HumanAPI 开发一个 Angular 应用程序。这里的基本思想是 HumanAPI 提供了几个解剖模型,可以使用iFrame(例如here)在网络应用程序中呈现这些模型。这个iFrame 的src 是一个链接,类似于:
https://human.biodigital.com/widget?m=congestive_heart_failure
因为我希望我的 Angular 应用程序的用户能够查看多个这样的模型,所以我有一个这些 URL 的列表,并根据用户的选择,我使用一个函数更新 iFrame 的 src updateFrameSrc 代码如下:
iframeSrc: SafeUrl;
this.iframeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(newUrl);
最后(问题来了,请和我在一起),为了在iFrame 本身内操作和注册不同的点击事件和用户与模型的交互,我们制作了一个这样的 HumanAPI 对象:
this.human = new HumanAPI(iFrameID);
这让我们可以使用像human.on('scene.picked') 这样的API 事件监听器函数来注册和保存点击事件(如我上面引用的示例所示)。所有这些都运行良好。
问题是,由于我在ngOnInit() 函数中初始化了human 对象并将human.on('scene.picked') 函数放在那里,所以在iFrame 源更改后我无法注册点击事件。据我了解,ngOnInit() 仅在组件首次初始化时调用一次,所以 可能 更新iFrame 源后human.on 的监听逻辑不可用?我尝试将逻辑放在不同的生命周期挂钩中,但它不起作用。
我目前的解决方法是在更新 iFrame 源后重新调用 ngOnInit() 函数,它就是这样工作的,但我认为这违反了标准生命周期管理实践。
我的问题是:
- 是否可以从组件逻辑中重新调用
ngOnInit()函数? - 如果不是,我应该在哪里放置一个 JavaScript API 函数,该函数始终监听来自
iFrame的点击事件,即使在iFrame的源已更改之后?
【问题讨论】:
-
为什么你不能把你需要的两行从 ngOnInit() 移到一个单独的函数中,并在 ngOnInit 和你的 updateFrameSrc 函数中调用该函数?
-
@AbrahamAl-Dabbagh 好的,这毕竟是答案。我曾尝试过这种方式,但在更新
iFrame源后忘记再次初始化human对象。请将此添加为答案,以便我接受!
标签: javascript angular typescript ngoninit