@flywine93/ngx-autounsubscrb
Version:
Angular 9+ automatically unsubscribe to the RXJS decorator, It is lightweight and practical!!
75 lines • 8.88 kB
JavaScript
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==