UNPKG

@bespunky/angular-zen

Version:

The Angular tools you always wished were there.

67 lines 8.76 kB
import { merge } from 'rxjs'; import { Directive, Input } from '@angular/core'; import { ObserveArrayDirective } from '../abstraction/observe-array-base.directive'; import * as i0 from "@angular/core"; /** * Documentation in {@link ObserveMergeDirective.observeMerge} to allow in-template tooltips. * * @export * @class ObserveMergeDirective * @extends {ObserveArrayDirective<T, EmittedArrayTypesOf<T>, ObserveMergeContext<T>>} * @template T The type of observables tuple received by the directive. */ export class ObserveMergeDirective extends ObserveArrayDirective { constructor() { super(...arguments); this.selector = 'observeMerge'; } /** * Combines an array of observables using rxjs {@link https://rxjs.dev/api/index/function/merge merge()} and exposes the emitted values to the template. * * Any template assigned with the directive will render immediately, and its view context will be updated with the emitted value on * each emission. The directive will be responsible for subscribing on init and unsubscribing on destroy. * * ## Features * * #### Shared observable * The watched observable will automatically be multicasted so that any child observables created by the template will use the same * stream. * * The shared observable can be accessed using the `let source = source` microsyntax. * * #### Observer events * Whenever the observable changes state or emits a value, the corresponding event is emitted: * `nextCalled` - A value has been emitted. `$event` will be the emitted value. * `errorCalled` - An error has occured in the pipeline. `$event` will be the error. * `completeCalled` - The observable has completed. `$event` will be void. * * > Because of limitations to Angular's Structural Directives, in order to bind the events the desugared syntax must be used. * This, for example, **will trigger** the event: * > ```html * ><ng-template [observe]="x$" let-source="source" (nextCalled)="onNext($event)"> * > ... * ></ng-template> * > ``` * > * >This **will NOT trigger** the event: * >```html * > <div *observe="x$; let source = source" (nextCalled)="onNext($event)">...</div> * >``` */ set observeMerge(value) { this.input.next(value); } static ngTemplateContextGuard(directive, context) { return true; } observeInput(input) { return merge(...input); } } ObserveMergeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ObserveMergeDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); ObserveMergeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: ObserveMergeDirective, selector: "[observeMerge]", inputs: { observeMerge: "observeMerge" }, usesInheritance: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ObserveMergeDirective, decorators: [{ type: Directive, args: [{ selector: '[observeMerge]' }] }], propDecorators: { observeMerge: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2ZS1tZXJnZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItemVuL2NvcmUvc3JjL3J4anMvb2JzZXJ2ZS9kaXJlY3RpdmVzL29ic2VydmUtbWVyZ2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUcsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFpQixNQUFNLDZDQUE2QyxDQUFDOztBQVFuRzs7Ozs7OztHQU9HO0FBSUgsTUFBTSxPQUFPLHFCQUNSLFNBQVEscUJBQXdFO0lBSnJGOztRQU1jLGFBQVEsR0FBRyxjQUFjLENBQUM7S0EyQ3ZDO0lBekNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWdDRztJQUNILElBQW9CLFlBQVksQ0FBQyxLQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBa0MsU0FBbUMsRUFBRSxPQUFnQixJQUF1QyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFL0osWUFBWSxDQUFDLEtBQVE7UUFFM0IsT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQXVDLENBQUM7SUFDakUsQ0FBQzs7bUhBN0NRLHFCQUFxQjt1R0FBckIscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGdCQUFnQjtpQkFDN0I7OEJBdUN1QixZQUFZO3NCQUEvQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQgIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmVBcnJheURpcmVjdGl2ZSAgICAgICAgICAgICAgICB9IGZyb20gJy4uL2Fic3RyYWN0aW9uL29ic2VydmUtYXJyYXktYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUmVzb2x2ZWRPYnNlcnZlQ29udGV4dCAgICAgICAgICAgICAgIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb24vdHlwZXMvZ2VuZXJhbCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlQXJyYXksIEVtaXR0ZWRBcnJheVR5cGVzT2YgfSBmcm9tICcuLi9hYnN0cmFjdGlvbi90eXBlcy9hcnJheXMnO1xuXG50eXBlIE9ic2VydmVNZXJnZUNvbnRleHQ8VCBleHRlbmRzIE9ic2VydmFibGVBcnJheT4gPSBSZXNvbHZlZE9ic2VydmVDb250ZXh0PEVtaXR0ZWRBcnJheVR5cGVzT2Y8VD4+ICYge1xuICAgIG9ic2VydmVNZXJnZTogRW1pdHRlZEFycmF5VHlwZXNPZjxUPlxufTtcblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIGluIHtAbGluayBPYnNlcnZlTWVyZ2VEaXJlY3RpdmUub2JzZXJ2ZU1lcmdlfSB0byBhbGxvdyBpbi10ZW1wbGF0ZSB0b29sdGlwcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgT2JzZXJ2ZU1lcmdlRGlyZWN0aXZlXG4gKiBAZXh0ZW5kcyB7T2JzZXJ2ZUFycmF5RGlyZWN0aXZlPFQsIEVtaXR0ZWRBcnJheVR5cGVzT2Y8VD4sIE9ic2VydmVNZXJnZUNvbnRleHQ8VD4+fVxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2Ygb2JzZXJ2YWJsZXMgdHVwbGUgcmVjZWl2ZWQgYnkgdGhlIGRpcmVjdGl2ZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbb2JzZXJ2ZU1lcmdlXSdcbn0pXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZU1lcmdlRGlyZWN0aXZlPFQgZXh0ZW5kcyBPYnNlcnZhYmxlPHVua25vd24+W10+XG4gICAgIGV4dGVuZHMgT2JzZXJ2ZUFycmF5RGlyZWN0aXZlPFQsIEVtaXR0ZWRBcnJheVR5cGVzT2Y8VD4sIE9ic2VydmVNZXJnZUNvbnRleHQ8VD4+XG57XG4gICAgcHJvdGVjdGVkIHNlbGVjdG9yID0gJ29ic2VydmVNZXJnZSc7XG5cbiAgICAvKipcbiAgICAgKiBDb21iaW5lcyBhbiBhcnJheSBvZiBvYnNlcnZhYmxlcyB1c2luZyByeGpzIHtAbGluayBodHRwczovL3J4anMuZGV2L2FwaS9pbmRleC9mdW5jdGlvbi9tZXJnZSBtZXJnZSgpfSBhbmQgZXhwb3NlcyB0aGUgZW1pdHRlZCB2YWx1ZXMgdG8gdGhlIHRlbXBsYXRlLlxuICAgICAqIFxuICAgICAqIEFueSB0ZW1wbGF0ZSBhc3NpZ25lZCB3aXRoIHRoZSBkaXJlY3RpdmUgd2lsbCByZW5kZXIgaW1tZWRpYXRlbHksIGFuZCBpdHMgdmlldyBjb250ZXh0IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBlbWl0dGVkIHZhbHVlIG9uXG4gICAgICogZWFjaCBlbWlzc2lvbi4gVGhlIGRpcmVjdGl2ZSB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBzdWJzY3JpYmluZyBvbiBpbml0IGFuZCB1bnN1YnNjcmliaW5nIG9uIGRlc3Ryb3kuXG4gICAgICogXG4gICAgICogIyMgRmVhdHVyZXNcbiAgICAgKiBcbiAgICAgKiAjIyMjIFNoYXJlZCBvYnNlcnZhYmxlXG4gICAgICogVGhlIHdhdGNoZWQgb2JzZXJ2YWJsZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgbXVsdGljYXN0ZWQgc28gdGhhdCBhbnkgY2hpbGQgb2JzZXJ2YWJsZXMgY3JlYXRlZCBieSB0aGUgdGVtcGxhdGUgd2lsbCB1c2UgdGhlIHNhbWVcbiAgICAgKiBzdHJlYW0uXG4gICAgICogXG4gICAgICogVGhlIHNoYXJlZCBvYnNlcnZhYmxlIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgYGxldCBzb3VyY2UgPSBzb3VyY2VgIG1pY3Jvc3ludGF4LlxuICAgICAqIFxuICAgICAqICMjIyMgT2JzZXJ2ZXIgZXZlbnRzXG4gICAgICogV2hlbmV2ZXIgdGhlIG9ic2VydmFibGUgY2hhbmdlcyBzdGF0ZSBvciBlbWl0cyBhIHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyBldmVudCBpcyBlbWl0dGVkOiAgXG4gICAgICogYG5leHRDYWxsZWRgIC0gQSB2YWx1ZSBoYXMgYmVlbiBlbWl0dGVkLiBgJGV2ZW50YCB3aWxsIGJlIHRoZSBlbWl0dGVkIHZhbHVlLiAgXG4gICAgICogYGVycm9yQ2FsbGVkYCAtIEFuIGVycm9yIGhhcyBvY2N1cmVkIGluIHRoZSBwaXBlbGluZS4gYCRldmVudGAgd2lsbCBiZSB0aGUgZXJyb3IuICBcbiAgICAgKiBgY29tcGxldGVDYWxsZWRgIC0gVGhlIG9ic2VydmFibGUgaGFzIGNvbXBsZXRlZC4gYCRldmVudGAgd2lsbCBiZSB2b2lkLlxuICAgICAqXG4gICAgICogPiBCZWNhdXNlIG9mIGxpbWl0YXRpb25zIHRvIEFuZ3VsYXIncyBTdHJ1Y3R1cmFsIERpcmVjdGl2ZXMsIGluIG9yZGVyIHRvIGJpbmQgdGhlIGV2ZW50cyB0aGUgZGVzdWdhcmVkIHN5bnRheCBtdXN0IGJlIHVzZWQuXG4gICAgICogVGhpcywgZm9yIGV4YW1wbGUsICoqd2lsbCB0cmlnZ2VyKiogdGhlIGV2ZW50OlxuICAgICAqID4gYGBgaHRtbFxuICAgICAqID48bmctdGVtcGxhdGUgW29ic2VydmVdPVwieCRcIiBsZXQtc291cmNlPVwic291cmNlXCIgKG5leHRDYWxsZWQpPVwib25OZXh0KCRldmVudClcIj5cbiAgICAgKiA+ICAgIC4uLlxuICAgICAqID48L25nLXRlbXBsYXRlPlxuICAgICAqID4gYGBgXG4gICAgICogPlxuICAgICAqID5UaGlzICoqd2lsbCBOT1QgdHJpZ2dlcioqIHRoZSBldmVudDpcbiAgICAgKiA+YGBgaHRtbFxuICAgICAqID4gPGRpdiAqb2JzZXJ2ZT1cIngkOyBsZXQgc291cmNlID0gc291cmNlXCIgKG5leHRDYWxsZWQpPVwib25OZXh0KCRldmVudClcIj4uLi48L2Rpdj5cbiAgICAgKiA+YGBgXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHNldCBvYnNlcnZlTWVyZ2UodmFsdWU6IFQpIHsgdGhpcy5pbnB1dC5uZXh0KHZhbHVlKTsgfVxuICAgIFxuICAgIHN0YXRpYyBuZ1RlbXBsYXRlQ29udGV4dEd1YXJkPFQgZXh0ZW5kcyBPYnNlcnZhYmxlPHVua25vd24+W10+KGRpcmVjdGl2ZTogT2JzZXJ2ZU1lcmdlRGlyZWN0aXZlPFQ+LCBjb250ZXh0OiB1bmtub3duKTogY29udGV4dCBpcyBPYnNlcnZlTWVyZ2VDb250ZXh0PFQ+IHsgcmV0dXJuIHRydWU7IH1cbiAgICBcbiAgICBwcm90ZWN0ZWQgb2JzZXJ2ZUlucHV0KGlucHV0OiBUKTogT2JzZXJ2YWJsZTxFbWl0dGVkQXJyYXlUeXBlc09mPFQ+PlxuICAgIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKC4uLmlucHV0KSBhcyBPYnNlcnZhYmxlPEVtaXR0ZWRBcnJheVR5cGVzT2Y8VD4+O1xuICAgIH1cbn1cbiJdfQ==