我可以从Angular2广播到JavaScript监听器

时间:2017-10-12 12:16:48

标签: angular events gwt

我有一个使用两种技术编写前端的应用程序。旧的前端写在GWT上,而新的是Angular 2.现在它们共存在一起,直到我们将所有内容重写为Angular。 但有时我们需要说一些从GWT到Angular的内容。或者以另一种方式。例如,我们有一个写在GWT上的旧模态窗口。我们需要从Angular打开它。 为此,我们在GWT上创建NgFacade,它可以使用窗口变量和本机js推送和订阅事件:

private static native void pushEvent(String ngEventId)/*-{
  if($wnd.ngGwtEventBus){
     $wnd.ngGwtEventBus.pushEvent(ngEventId)
  }
}-*/

private static native void subscribeEvent(String ngEventId, Comand comand)/*-{
  if($wnd.ngGwtEventBus){
     $wnd.ngGwtEventBus.subscribeEvent(ngEventId, there comand that we want execute)
  }
}-*/

在Angular方面,我们创建eventBus服务,我们推送事件,这个服务可以像那样发出它:

private emitters: {[eventId:string]:EventEmmiter<any>}= {};

private getEmitter(eventId:string):EventEmmiter<any> {
   if (!this.emmiters[eventId]){
      this.emmiters[eventId] = new EventEmmiter();
   }
   return this.emmiters[eventId]
}

public pushEvent(event: AppEvent<any>):void {
  this.getEmitter(event.getId).emmit(event.getValue);
}

在一切运作良好之前。在app init上,我们在GWT端创建一个事件处理程序,将其写在窗口变量上。然后我们只需要来自Angular端的这个单例服务的init事件。

但是在我们重构了应用程序的Angular端并将所有内容划分到使用LazyLoading加载的不同模块上之后。我们将此服务移至SharedModule并停止工作。我使用forRoot部分进行此操作,并使用SharedModuleAppModule中导入SharedModule.forRoot()

是的,如果获取本地window对象并通过引用直接发出事件,我仍然可以从服务中发出事件。但在此之前我能在此服务中的Emmti事件和我窗口中的处理程序知道此事件。看起来我可以随处发射事件。有人可以帮助我。

也许有人知道如何在角度应用程序外部初始化从角度到JavaScript/Jquery侦听器的事件?

1 个答案:

答案 0 :(得分:0)

你可以使用JavaScript事件,毕竟两种语言都是运行时的javascript,并且利用浏览器事件机制很方便。

这是一个例子:https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events