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 函数?

angular.js:Typescript 类构造函数“这是未定义的”

在 TypeScript Angular 指令中调用函数?

如何在 Typescript Angular 的另一个函数中调用一个函数