* Gets an observable that adds an event listener to the map when a consumer subscribes to it. * @param name Name of the event for which the observable is being set up. * @param type Type of the event (e.g. one going to a DOM node or a custom Maps one).
(name: string, type?: 'custom' | 'native')
| 50 | * @param type Type of the event (e.g. one going to a DOM node or a custom Maps one). |
| 51 | */ |
| 52 | getLazyEmitter<T>(name: string, type?: 'custom' | 'native'): Observable<T> { |
| 53 | return this._targetStream.pipe( |
| 54 | switchMap(target => { |
| 55 | const observable = new Observable<T>(observer => { |
| 56 | // If the target hasn't been initialized yet, cache the observer so it can be added later. |
| 57 | if (!target) { |
| 58 | this._pending.push({observable, observer}); |
| 59 | return undefined; |
| 60 | } |
| 61 | |
| 62 | let handle: ListenerHandle; |
| 63 | const listener = (event: T) => { |
| 64 | this._ngZone.run(() => observer.next(event)); |
| 65 | }; |
| 66 | |
| 67 | if (type === 'native') { |
| 68 | if ( |
| 69 | (typeof ngDevMode === 'undefined' || ngDevMode) && |
| 70 | (!target.addEventListener || !target.removeEventListener) |
| 71 | ) { |
| 72 | throw new Error( |
| 73 | 'Maps event target that uses native events must have `addEventListener` and `removeEventListener` methods.', |
| 74 | ); |
| 75 | } |
| 76 | |
| 77 | target.addEventListener!(name, listener); |
| 78 | handle = {remove: () => target.removeEventListener!(name, listener)}; |
| 79 | } else { |
| 80 | handle = target.addListener(name, listener)!; |
| 81 | } |
| 82 | |
| 83 | // If there's an error when initializing the Maps API (e.g. a wrong API key), it will |
| 84 | // return a dummy object that returns `undefined` from `addListener` (see #26514). |
| 85 | if (!handle) { |
| 86 | observer.complete(); |
| 87 | return undefined; |
| 88 | } |
| 89 | |
| 90 | this._listeners.push(handle); |
| 91 | return () => handle.remove(); |
| 92 | }); |
| 93 | |
| 94 | return observable; |
| 95 | }), |
| 96 | ); |
| 97 | } |
| 98 | |
| 99 | /** Sets the current target that the manager should bind events to. */ |
| 100 | setTarget(target: MapEventManagerTarget) { |
no test coverage detected