packages/core/src/models/Heart.ts (64 lines of code) (raw):

import { isStr, isArr, Subscribable } from '@formily/shared' import { LifeCycle } from './LifeCycle' import { IHeartProps } from '../types' export class Heart<Payload = any, Context = any> extends Subscribable { lifecycles: LifeCycle<Payload>[] = [] outerLifecycles: Map<any, LifeCycle<Payload>[]> = new Map() context: Context constructor({ lifecycles, context }: IHeartProps<Context> = {}) { super() this.lifecycles = this.buildLifeCycles(lifecycles || []) this.context = context } buildLifeCycles = (lifecycles: LifeCycle[]) => { return lifecycles.reduce((buf, item) => { if (item instanceof LifeCycle) { return buf.concat(item) } else { if (isArr(item)) { return this.buildLifeCycles(item) } else if (typeof item === 'object') { this.context = item return buf } return buf } }, []) } addLifeCycles = (id: any, lifecycles: LifeCycle[] = []) => { const observers = this.buildLifeCycles(lifecycles) if (observers.length) { this.outerLifecycles.set(id, observers) } } hasLifeCycles = (id: any) => { return this.outerLifecycles.has(id) } removeLifeCycles = (id: any) => { this.outerLifecycles.delete(id) } setLifeCycles = (lifecycles: LifeCycle[] = []) => { this.lifecycles = this.buildLifeCycles(lifecycles) } publish = <P, C>(type: any, payload?: P, context?: C) => { if (isStr(type)) { this.lifecycles.forEach((lifecycle) => { lifecycle.notify(type, payload, context || this.context) }) this.outerLifecycles.forEach((lifecycles) => { lifecycles.forEach((lifecycle) => { lifecycle.notify(type, payload, context || this.context) }) }) this.notify({ type, payload, }) } } clear = () => { this.lifecycles = [] this.outerLifecycles.clear() this.unsubscribe() } }