Skip to content

Instantly share code, notes, and snippets.

@MarsiBarsi
MarsiBarsi / window.ts
Created June 14, 2020 15:04
window token
import {DOCUMENT} from '@angular/common';
import {inject, InjectionToken} from '@angular/core';
export const WINDOW = new InjectionToken<Window>(
'An abstraction over global window object',
{
factory: () => {
const {defaultView} = inject(DOCUMENT);
if (!defaultView) {
@MarsiBarsi
MarsiBarsi / mark-control-and-update.ts
Created June 11, 2020 10:54
Mark control and update validity function
import {AbstractControl, FormArray, FormGroup} from '@angular/forms';
export function markControlAsTouchedAndValidate(control: AbstractControl) {
if (control instanceof FormArray) {
control.controls.forEach(nestedControl => {
markControlAsTouchedAndValidate(nestedControl);
});
return;
}
@MarsiBarsi
MarsiBarsi / replay-control-value-changes.ts
Last active November 3, 2022 00:04
replay-control-value-changes.ts
export class ReplayControlValueChanges<T> extends Observable<T> {
constructor(control: AbstractControl | AbstractControlDirective) {
super(subscriber => {
if (!control.valueChanges) {
throw new Error('Control does not have valueChanges');
}
control.valueChanges.pipe(startWith(control.value)).subscribe(subscriber);
});
}
export function watch<T>(
changeDetectorRef: ChangeDetectorRef,
): MonoTypeOperatorFunction<T> {
return (source: Observable<T>) =>
source.pipe(
tap(() => {
changeDetectorRef.markForCheck();
}),
);
}