From c072db596e3402518af253a3bef5d0010116d6c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 2 Jan 2023 16:21:35 +0100 Subject: [PATCH] observe method on element --- .../src/core/element/element.mixin.ts | 19 ++++++++++++++----- .../observable-api/observer.controller.ts | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/core/element/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/core/element/element.mixin.ts index 97cee0703b..c7e8ea145e 100644 --- a/src/Umbraco.Web.UI.Client/src/core/element/element.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/core/element/element.mixin.ts @@ -1,9 +1,11 @@ +import { Observable } from 'rxjs'; import { UmbContextConsumerController } from '../context-api/consume/context-consumer.controller'; import { isContextConsumerType } from '../context-api/consume/is-context-consumer-type.function'; import { UmbContextProviderController } from '../context-api/provide/context-provider.controller'; import { UmbControllerHostInterface, UmbControllerHostMixin } from '../controller/controller-host.mixin'; import { UmbControllerInterface } from '../controller/controller.interface'; import type { HTMLElementConstructor } from '../models'; +import { UmbObserverController } from '../observable-api/observer.controller'; // TODO: can we use this aliases to generate the key of this type interface ResolvedContexts { @@ -18,15 +20,22 @@ export declare class UmbElementMixinInterface extends UmbControllerHostInterface export const UmbElementMixin = (superClass: T) => { class UmbElementMixinClass extends UmbControllerHostMixin(superClass) { - + /** + * Observe a RxJS source of choice. + * @param {string} alias + * @param {method} callback Callback method called when data is changed. + */ + observe(source: Observable, callback: (_value: Y) => void): UmbObserverController { + return new UmbObserverController(this, source, callback); + } /** * Provide a context API for this or child elements. * @param {string} alias * @param {instance} instance The API instance to be exposed. */ - provideContext(alias: string, instance: unknown) { - new UmbContextProviderController(this, alias, instance); + provideContext(alias: string, instance: unknown): UmbContextProviderController { + return new UmbContextProviderController(this, alias, instance); } /** @@ -34,8 +43,8 @@ export const UmbElementMixin = (superClass: T) * @param {string} alias * @param {method} callback Callback method called when context is resolved. */ - consumeContext(alias: string, callback: (_instance: any) => void): void { - new UmbContextConsumerController(this, alias, callback); + consumeContext(alias: string, callback: (_instance: any) => void): UmbContextConsumerController { + return new UmbContextConsumerController(this, alias, callback); } /** diff --git a/src/Umbraco.Web.UI.Client/src/core/observable-api/observer.controller.ts b/src/Umbraco.Web.UI.Client/src/core/observable-api/observer.controller.ts index cdd7042b7b..dd50cd541b 100644 --- a/src/Umbraco.Web.UI.Client/src/core/observable-api/observer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/core/observable-api/observer.controller.ts @@ -8,6 +8,7 @@ export class UmbObserverController extends UmbObserver implements Um constructor(host:UmbControllerHostInterface, source: Observable, callback: (_value: Y) => void) { super(source, callback); + // TODO: What should happen if source or some? identifier is already present? host.addController(this); }