File

projects/ngx-amap/src/shared/event-binder.service.ts

Index

Methods

Constructor

constructor(logger: LoggerService, ngZone: NgZone)
Parameters :
Name Type Optional
logger LoggerService No
ngZone NgZone No

Methods

bindEvent
bindEvent(target: Observable, eventName: string)
Type parameters :
  • T

注册事件

Parameters :
Name Type Optional Description
target Observable<T> No
eventName string No

事件名

Returns : EventEmitter<any>
import { Injectable, NgZone, EventEmitter } from '@angular/core';
import { Observable } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { LoggerService } from './logger/logger.service';

const TAG = 'EventBinder';

@Injectable()
export class EventBinderService {
  constructor(private logger: LoggerService, private ngZone: NgZone) {}

  /**
   * 注册事件
   * @param eventName 事件名
   */
  bindEvent<T extends AMap.EventEmitter>(
    target: Observable<T>,
    eventName: string,
  ): EventEmitter<any> {
    return target.pipe(
      switchMap(
        (t: T) =>
          new Observable(observer => {
            let handler = AMap.event.addListener(
              t,
              eventName,
              e => {
                this.ngZone.run(() => observer.next(e));
              },
              this,
            );
            this.logger.d(TAG, `subscribed event: ${eventName}`);
            return () => {
              AMap.event.removeListener(handler);
              this.logger.d(TAG, `unsubscribed event: ${eventName}`);
              eventName = null;
              handler = null;
            };
          }),
      ),
    ) as EventEmitter<any>;
  }
}

result-matching ""

    No results matching ""