Angular 2 - typescript 函数与外部 js 库的通信
Posted
技术标签:
【中文标题】Angular 2 - typescript 函数与外部 js 库的通信【英文标题】:Angular 2 - communication of typescript functions with external js libraries 【发布时间】:2016-08-28 02:44:55 【问题描述】:使用javascript Infovis Toolkit 作为绘制图形和树的外部库。我需要操作节点的 onClick 方法,以便向服务器异步发送 HTTP GET 请求,并将来自服务器的数据分配给 Angular 服务类的属性和变量。通过使用 webpack 将所有已编译的 typescript 打包到单个 js 文件中,输出文件令人困惑且不可读。因此,从外部 js 库调用编译后的 js 文件中的函数显然不是最好的解决方案。
我在我的 Angular 服务中尝试了以下解决方案,这样我就可以毫无问题地访问该服务的属性:
document.addEventListener('DOMContentLoaded', function ()
var nodes = document.querySelectorAll(".nodes"); // nodes = []
for (var i = 0; i < nodes.length; i++) // nodes.length = 0
nodes[i].addEventListener("click", function ()
// asynchronously sending GET request to the server
// and assing receiving data to the properties of this Angular service
);
);
但是,此解决方案不起作用,因为在 Javascript Infovis Toolkit 中,节点是在完成 DOM 渲染之后以及在 window.onload
事件之后绘制的。这个库有一些生命周期方法,例如在绘制树完成后调用的 onAfterCompute()。如何触发全局事件来通知 Angular 服务树的绘制完成并且可以查询所有节点?
【问题讨论】:
【参考方案1】:只需使用dispatchEvent 触发自定义事件。
在 Angular 中,您可以通过添加任何实际添加到 DOM 的组件来监听:
在任何模板中:<div (window:custom-event)="updateNodes($event)">
或在组件类中:
@HostListener('window:custom-event', ['$event'])
updateNodes(event)
...
或在@Component()
或@Directive()
注解中:
@Component(
selector: '...',
host: '(window:custom-event)':'updateNodes($event)'
)
其中custom-event
是调度事件的类型,updateNodes(event)
是组件类中的一个方法。
在 JavaScript 中手动触发:
window.dispatchEvent(new Event('custom-event'));
另一种方法
就像Angular2 - how to call component function from outside the app 中解释的那样,让组件(或指令、服务)的方法在 Angular 之外可用。
【讨论】:
以上是关于Angular 2 - typescript 函数与外部 js 库的通信的主要内容,如果未能解决你的问题,请参考以下文章
Typescript/Angular - 模态结果返回后调用单独的函数
Angular / TypeScript - 在另一个函数完成后调用一个函数
如何在 Angular 5 中从 Typescript 调用 JavaScript 函数?