cdk-observers.umd.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /**
  2. * @license
  3. * Copyright Google LLC All Rights Reserved.
  4. *
  5. * Use of this source code is governed by an MIT-style license that can be
  6. * found in the LICENSE file at https://angular.io/license
  7. */
  8. (function (global, factory) {
  9. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/coercion'), require('@angular/core'), require('rxjs'), require('rxjs/operators')) :
  10. typeof define === 'function' && define.amd ? define('@angular/cdk/observers', ['exports', '@angular/cdk/coercion', '@angular/core', 'rxjs', 'rxjs/operators'], factory) :
  11. (factory((global.ng = global.ng || {}, global.ng.cdk = global.ng.cdk || {}, global.ng.cdk.observers = {}),global.ng.cdk.coercion,global.ng.core,global.rxjs,global.rxjs.operators));
  12. }(this, (function (exports,coercion,core,rxjs,operators) { 'use strict';
  13. /**
  14. * @fileoverview added by tsickle
  15. * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  16. */
  17. /**
  18. * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.
  19. * \@docs-private
  20. */
  21. var MutationObserverFactory = /** @class */ (function () {
  22. function MutationObserverFactory() {
  23. }
  24. /**
  25. * @param {?} callback
  26. * @return {?}
  27. */
  28. MutationObserverFactory.prototype.create = /**
  29. * @param {?} callback
  30. * @return {?}
  31. */
  32. function (callback) {
  33. return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);
  34. };
  35. MutationObserverFactory.decorators = [
  36. { type: core.Injectable, args: [{ providedIn: 'root' },] },
  37. ];
  38. /** @nocollapse */ MutationObserverFactory.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function MutationObserverFactory_Factory() { return new MutationObserverFactory(); }, token: MutationObserverFactory, providedIn: "root" });
  39. return MutationObserverFactory;
  40. }());
  41. /**
  42. * An injectable service that allows watching elements for changes to their content.
  43. */
  44. var ContentObserver = /** @class */ (function () {
  45. function ContentObserver(_mutationObserverFactory) {
  46. this._mutationObserverFactory = _mutationObserverFactory;
  47. /**
  48. * Keeps track of the existing MutationObservers so they can be reused.
  49. */
  50. this._observedElements = new Map();
  51. }
  52. /**
  53. * @return {?}
  54. */
  55. ContentObserver.prototype.ngOnDestroy = /**
  56. * @return {?}
  57. */
  58. function () {
  59. var _this = this;
  60. this._observedElements.forEach((/**
  61. * @param {?} _
  62. * @param {?} element
  63. * @return {?}
  64. */
  65. function (_, element) { return _this._cleanupObserver(element); }));
  66. };
  67. /**
  68. * @param {?} elementOrRef
  69. * @return {?}
  70. */
  71. ContentObserver.prototype.observe = /**
  72. * @param {?} elementOrRef
  73. * @return {?}
  74. */
  75. function (elementOrRef) {
  76. var _this = this;
  77. /** @type {?} */
  78. var element = coercion.coerceElement(elementOrRef);
  79. return new rxjs.Observable((/**
  80. * @param {?} observer
  81. * @return {?}
  82. */
  83. function (observer) {
  84. /** @type {?} */
  85. var stream = _this._observeElement(element);
  86. /** @type {?} */
  87. var subscription = stream.subscribe(observer);
  88. return (/**
  89. * @return {?}
  90. */
  91. function () {
  92. subscription.unsubscribe();
  93. _this._unobserveElement(element);
  94. });
  95. }));
  96. };
  97. /**
  98. * Observes the given element by using the existing MutationObserver if available, or creating a
  99. * new one if not.
  100. */
  101. /**
  102. * Observes the given element by using the existing MutationObserver if available, or creating a
  103. * new one if not.
  104. * @private
  105. * @param {?} element
  106. * @return {?}
  107. */
  108. ContentObserver.prototype._observeElement = /**
  109. * Observes the given element by using the existing MutationObserver if available, or creating a
  110. * new one if not.
  111. * @private
  112. * @param {?} element
  113. * @return {?}
  114. */
  115. function (element) {
  116. if (!this._observedElements.has(element)) {
  117. /** @type {?} */
  118. var stream_1 = new rxjs.Subject();
  119. /** @type {?} */
  120. var observer = this._mutationObserverFactory.create((/**
  121. * @param {?} mutations
  122. * @return {?}
  123. */
  124. function (mutations) { return stream_1.next(mutations); }));
  125. if (observer) {
  126. observer.observe(element, {
  127. characterData: true,
  128. childList: true,
  129. subtree: true
  130. });
  131. }
  132. this._observedElements.set(element, { observer: observer, stream: stream_1, count: 1 });
  133. }
  134. else {
  135. (/** @type {?} */ (this._observedElements.get(element))).count++;
  136. }
  137. return (/** @type {?} */ (this._observedElements.get(element))).stream;
  138. };
  139. /**
  140. * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is
  141. * observing this element.
  142. */
  143. /**
  144. * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is
  145. * observing this element.
  146. * @private
  147. * @param {?} element
  148. * @return {?}
  149. */
  150. ContentObserver.prototype._unobserveElement = /**
  151. * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is
  152. * observing this element.
  153. * @private
  154. * @param {?} element
  155. * @return {?}
  156. */
  157. function (element) {
  158. if (this._observedElements.has(element)) {
  159. (/** @type {?} */ (this._observedElements.get(element))).count--;
  160. if (!(/** @type {?} */ (this._observedElements.get(element))).count) {
  161. this._cleanupObserver(element);
  162. }
  163. }
  164. };
  165. /** Clean up the underlying MutationObserver for the specified element. */
  166. /**
  167. * Clean up the underlying MutationObserver for the specified element.
  168. * @private
  169. * @param {?} element
  170. * @return {?}
  171. */
  172. ContentObserver.prototype._cleanupObserver = /**
  173. * Clean up the underlying MutationObserver for the specified element.
  174. * @private
  175. * @param {?} element
  176. * @return {?}
  177. */
  178. function (element) {
  179. if (this._observedElements.has(element)) {
  180. var _a = (/** @type {?} */ (this._observedElements.get(element))), observer = _a.observer, stream = _a.stream;
  181. if (observer) {
  182. observer.disconnect();
  183. }
  184. stream.complete();
  185. this._observedElements.delete(element);
  186. }
  187. };
  188. ContentObserver.decorators = [
  189. { type: core.Injectable, args: [{ providedIn: 'root' },] },
  190. ];
  191. /** @nocollapse */
  192. ContentObserver.ctorParameters = function () { return [
  193. { type: MutationObserverFactory }
  194. ]; };
  195. /** @nocollapse */ ContentObserver.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function ContentObserver_Factory() { return new ContentObserver(core.ɵɵinject(MutationObserverFactory)); }, token: ContentObserver, providedIn: "root" });
  196. return ContentObserver;
  197. }());
  198. /**
  199. * Directive that triggers a callback whenever the content of
  200. * its associated element has changed.
  201. */
  202. var CdkObserveContent = /** @class */ (function () {
  203. function CdkObserveContent(_contentObserver, _elementRef, _ngZone) {
  204. this._contentObserver = _contentObserver;
  205. this._elementRef = _elementRef;
  206. this._ngZone = _ngZone;
  207. /**
  208. * Event emitted for each change in the element's content.
  209. */
  210. this.event = new core.EventEmitter();
  211. this._disabled = false;
  212. this._currentSubscription = null;
  213. }
  214. Object.defineProperty(CdkObserveContent.prototype, "disabled", {
  215. /**
  216. * Whether observing content is disabled. This option can be used
  217. * to disconnect the underlying MutationObserver until it is needed.
  218. */
  219. get: /**
  220. * Whether observing content is disabled. This option can be used
  221. * to disconnect the underlying MutationObserver until it is needed.
  222. * @return {?}
  223. */
  224. function () { return this._disabled; },
  225. set: /**
  226. * @param {?} value
  227. * @return {?}
  228. */
  229. function (value) {
  230. this._disabled = coercion.coerceBooleanProperty(value);
  231. this._disabled ? this._unsubscribe() : this._subscribe();
  232. },
  233. enumerable: true,
  234. configurable: true
  235. });
  236. Object.defineProperty(CdkObserveContent.prototype, "debounce", {
  237. /** Debounce interval for emitting the changes. */
  238. get: /**
  239. * Debounce interval for emitting the changes.
  240. * @return {?}
  241. */
  242. function () { return this._debounce; },
  243. set: /**
  244. * @param {?} value
  245. * @return {?}
  246. */
  247. function (value) {
  248. this._debounce = coercion.coerceNumberProperty(value);
  249. this._subscribe();
  250. },
  251. enumerable: true,
  252. configurable: true
  253. });
  254. /**
  255. * @return {?}
  256. */
  257. CdkObserveContent.prototype.ngAfterContentInit = /**
  258. * @return {?}
  259. */
  260. function () {
  261. if (!this._currentSubscription && !this.disabled) {
  262. this._subscribe();
  263. }
  264. };
  265. /**
  266. * @return {?}
  267. */
  268. CdkObserveContent.prototype.ngOnDestroy = /**
  269. * @return {?}
  270. */
  271. function () {
  272. this._unsubscribe();
  273. };
  274. /**
  275. * @private
  276. * @return {?}
  277. */
  278. CdkObserveContent.prototype._subscribe = /**
  279. * @private
  280. * @return {?}
  281. */
  282. function () {
  283. var _this = this;
  284. this._unsubscribe();
  285. /** @type {?} */
  286. var stream = this._contentObserver.observe(this._elementRef);
  287. // TODO(mmalerba): We shouldn't be emitting on this @Output() outside the zone.
  288. // Consider brining it back inside the zone next time we're making breaking changes.
  289. // Bringing it back inside can cause things like infinite change detection loops and changed
  290. // after checked errors if people's code isn't handling it properly.
  291. this._ngZone.runOutsideAngular((/**
  292. * @return {?}
  293. */
  294. function () {
  295. _this._currentSubscription =
  296. (_this.debounce ? stream.pipe(operators.debounceTime(_this.debounce)) : stream).subscribe(_this.event);
  297. }));
  298. };
  299. /**
  300. * @private
  301. * @return {?}
  302. */
  303. CdkObserveContent.prototype._unsubscribe = /**
  304. * @private
  305. * @return {?}
  306. */
  307. function () {
  308. if (this._currentSubscription) {
  309. this._currentSubscription.unsubscribe();
  310. }
  311. };
  312. CdkObserveContent.decorators = [
  313. { type: core.Directive, args: [{
  314. selector: '[cdkObserveContent]',
  315. exportAs: 'cdkObserveContent',
  316. },] },
  317. ];
  318. /** @nocollapse */
  319. CdkObserveContent.ctorParameters = function () { return [
  320. { type: ContentObserver },
  321. { type: core.ElementRef },
  322. { type: core.NgZone }
  323. ]; };
  324. CdkObserveContent.propDecorators = {
  325. event: [{ type: core.Output, args: ['cdkObserveContent',] }],
  326. disabled: [{ type: core.Input, args: ['cdkObserveContentDisabled',] }],
  327. debounce: [{ type: core.Input }]
  328. };
  329. return CdkObserveContent;
  330. }());
  331. var ObserversModule = /** @class */ (function () {
  332. function ObserversModule() {
  333. }
  334. ObserversModule.decorators = [
  335. { type: core.NgModule, args: [{
  336. exports: [CdkObserveContent],
  337. declarations: [CdkObserveContent],
  338. providers: [MutationObserverFactory]
  339. },] },
  340. ];
  341. return ObserversModule;
  342. }());
  343. exports.MutationObserverFactory = MutationObserverFactory;
  344. exports.ContentObserver = ContentObserver;
  345. exports.CdkObserveContent = CdkObserveContent;
  346. exports.ObserversModule = ObserversModule;
  347. Object.defineProperty(exports, '__esModule', { value: true });
  348. })));
  349. //# sourceMappingURL=cdk-observers.umd.js.map