UNPKG

@flywine93/ngx-autounsubscrb

Version:

Angular 9+ automatically unsubscribe to the RXJS decorator, It is lightweight and practical!!

75 lines 8.88 kB
import { IvyKey } from './constant'; import { isFun } from './util'; const defaultOptions = { blackList: [], checkArrVar: false }; /** * unsubscribe variable * @param member public and private member or temp variable */ export function unsubscribe(variable, options) { if (variable) { if (isFun(variable.unsubscribe)) { variable.unsubscribe(); return; } // if variable is array type,will check and unsubscribe if (options.checkArrVar && Array.isArray(variable)) { for (const ele of variable) { if (ele && isFun(ele.unsubscribe)) { ele.unsubscribe(); } } } } } /** * unsubscribe member variable and temp variable when destroy. * @param options options * 1.blackList---Variables in blacklist are not cancelled */ export function AutoUnsubscrb(options = {}) { return function (target) { const original = target.prototype['ngOnDestroy']; // cache original ngOnDestroy function if (!isFun(original)) { throw new Error(`${target.name} is using @AutoUnsubscrb but does not implement OnDestroy`); } options = Object.assign(defaultOptions, options); target.prototype.autoAddList = []; // Used to cache objects added through MAutoAdd target.prototype.ngOnDestroy = function ngOnDestroy() { if (isFun(original)) { original.apply(this, arguments); // Preserve the original function } // unsubscribe public and private member variable for (const propName in this) { if (options.blackList.includes(propName)) { continue; } unsubscribe(this[propName], options); } // unsubscribe temp variable for (const sub of this.autoAddList) { unsubscribe(sub, options); } }; // Ivy if (target.prototype.constructor[IvyKey.cmp]) { target.prototype.constructor[IvyKey.cmp].onDestroy = target.prototype.ngOnDestroy; } else if (target.prototype.constructor[IvyKey.dir]) { target.prototype.constructor[IvyKey.dir].onDestroy = target.prototype.ngOnDestroy; } }; } /** * Manually add temporary variables and unsubscribe when destroy. * @param target Class this keyword * @param subscrb Temp variable */ export function MAutoAdd(target, subscrb) { if (target && target.autoAddList) { target.autoAddList.push(subscrb); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF1dG91bnN1YnNjcmIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmx5d2luZTkzL25neC1hdXRvdW5zdWJzY3JiLyIsInNvdXJjZXMiOlsibGliL25neC1hdXRvdW5zdWJzY3JiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU8vQixNQUFNLGNBQWMsR0FBRztJQUNyQixTQUFTLEVBQUUsRUFBRTtJQUNiLFdBQVcsRUFBRSxLQUFLO0NBQ25CLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLFFBQWEsRUFBRSxPQUFnQjtJQUN6RCxJQUFJLFFBQVEsRUFBRTtRQUNaLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMvQixRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkIsT0FBTztTQUNSO1FBQ0QsdURBQXVEO1FBQ3ZELElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO2dCQUMxQixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNqQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQ25CO2FBQ0Y7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFVBQW1CLEVBQUU7SUFDakQsT0FBTyxVQUFTLE1BQVc7UUFDekIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLHNDQUFzQztRQUN4RixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSwyREFBMkQsQ0FBQyxDQUFDO1NBQzVGO1FBQ0QsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztRQUNsRixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVc7WUFDakQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO2FBQ25FO1lBRUQsaURBQWlEO1lBQ2pELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxFQUFFO2dCQUMzQixJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUN4QyxTQUFTO2lCQUNWO2dCQUNELFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDdEM7WUFDRCw0QkFBNEI7WUFDNUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQyxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTTtRQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzVDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7U0FDbkY7YUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1NBQ25GO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQVcsRUFBRSxPQUFZO0lBQ2hELElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDaEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbEM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXZ5S2V5IH0gZnJvbSAnLi9jb25zdGFudCc7XG5pbXBvcnQgeyBpc0Z1biB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGJsYWNrTGlzdD86IHN0cmluZ1tdO1xuICBjaGVja0FyclZhcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBibGFja0xpc3Q6IFtdLFxuICBjaGVja0FyclZhcjogZmFsc2Vcbn07XG5cbi8qKlxuICogdW5zdWJzY3JpYmUgdmFyaWFibGVcbiAqIEBwYXJhbSBtZW1iZXIgcHVibGljIGFuZCBwcml2YXRlIG1lbWJlciBvciB0ZW1wIHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnN1YnNjcmliZSh2YXJpYWJsZTogYW55LCBvcHRpb25zOiBPcHRpb25zKTogdm9pZCB7XG4gIGlmICh2YXJpYWJsZSkge1xuICAgIGlmIChpc0Z1bih2YXJpYWJsZS51bnN1YnNjcmliZSkpIHtcbiAgICAgIHZhcmlhYmxlLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGlmIHZhcmlhYmxlIGlzIGFycmF5IHR5cGXvvIx3aWxsIGNoZWNrIGFuZCB1bnN1YnNjcmliZVxuICAgIGlmIChvcHRpb25zLmNoZWNrQXJyVmFyICYmIEFycmF5LmlzQXJyYXkodmFyaWFibGUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZSBvZiB2YXJpYWJsZSkge1xuICAgICAgICBpZiAoZWxlICYmIGlzRnVuKGVsZS51bnN1YnNjcmliZSkpIHtcbiAgICAgICAgICBlbGUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHVuc3Vic2NyaWJlIG1lbWJlciB2YXJpYWJsZSBhbmQgdGVtcCB2YXJpYWJsZSB3aGVuIGRlc3Ryb3kuXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zXG4gKiAxLmJsYWNrTGlzdC0tLVZhcmlhYmxlcyBpbiBibGFja2xpc3QgYXJlIG5vdCBjYW5jZWxsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEF1dG9VbnN1YnNjcmIob3B0aW9uczogT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBmdW5jdGlvbih0YXJnZXQ6IGFueSkge1xuICAgIGNvbnN0IG9yaWdpbmFsID0gdGFyZ2V0LnByb3RvdHlwZVsnbmdPbkRlc3Ryb3knXTsgLy8gY2FjaGUgb3JpZ2luYWwgbmdPbkRlc3Ryb3kgZnVuY3Rpb25cbiAgICBpZiAoIWlzRnVuKG9yaWdpbmFsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhcmdldC5uYW1lfSBpcyB1c2luZyBAQXV0b1Vuc3Vic2NyYiBidXQgZG9lcyBub3QgaW1wbGVtZW50IE9uRGVzdHJveWApO1xuICAgIH1cbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5hdXRvQWRkTGlzdCA9IFtdOyAvLyBVc2VkIHRvIGNhY2hlIG9iamVjdHMgYWRkZWQgdGhyb3VnaCBNQXV0b0FkZFxuICAgIHRhcmdldC5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiBuZ09uRGVzdHJveSgpIHtcbiAgICAgIGlmIChpc0Z1bihvcmlnaW5hbCkpIHtcbiAgICAgICAgb3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIHVuc3Vic2NyaWJlIHB1YmxpYyBhbmQgcHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVcbiAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdGhpcykge1xuICAgICAgICBpZiAob3B0aW9ucy5ibGFja0xpc3QuaW5jbHVkZXMocHJvcE5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdW5zdWJzY3JpYmUodGhpc1twcm9wTmFtZV0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgLy8gdW5zdWJzY3JpYmUgdGVtcCB2YXJpYWJsZVxuICAgICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5hdXRvQWRkTGlzdCkge1xuICAgICAgICB1bnN1YnNjcmliZShzdWIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gSXZ5XG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmNtcF0pIHtcbiAgICAgIHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmNtcF0ub25EZXN0cm95ID0gdGFyZ2V0LnByb3RvdHlwZS5uZ09uRGVzdHJveTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmRpcl0pIHtcbiAgICAgIHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmRpcl0ub25EZXN0cm95ID0gdGFyZ2V0LnByb3RvdHlwZS5uZ09uRGVzdHJveTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogTWFudWFsbHkgYWRkIHRlbXBvcmFyeSB2YXJpYWJsZXMgYW5kIHVuc3Vic2NyaWJlIHdoZW4gZGVzdHJveS5cbiAqIEBwYXJhbSB0YXJnZXQgQ2xhc3MgdGhpcyBrZXl3b3JkXG4gKiBAcGFyYW0gc3Vic2NyYiBUZW1wIHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNQXV0b0FkZCh0YXJnZXQ6IGFueSwgc3Vic2NyYjogYW55KTogdm9pZCB7XG4gIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmF1dG9BZGRMaXN0KSB7XG4gICAgdGFyZ2V0LmF1dG9BZGRMaXN0LnB1c2goc3Vic2NyYik7XG4gIH1cbn1cbiJdfQ==