mirror of
https://github.com/Redocly/redoc.git
synced 2024-11-26 10:33:44 +03:00
Fix leaks (fixes #167)
This commit is contained in:
parent
95f2da8b97
commit
104bcb9cef
|
@ -5,6 +5,7 @@ import { ElementRef,
|
||||||
Input,
|
Input,
|
||||||
Component,
|
Component,
|
||||||
OnInit,
|
OnInit,
|
||||||
|
OnDestroy,
|
||||||
HostBinding
|
HostBinding
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
|
|
||||||
|
@ -26,7 +27,9 @@ import { LazyTasksService } from '../../shared/components/LazyFor/lazy-for';
|
||||||
export class Redoc extends BaseComponent implements OnInit {
|
export class Redoc extends BaseComponent implements OnInit {
|
||||||
static _preOptions: any;
|
static _preOptions: any;
|
||||||
|
|
||||||
private element: any;
|
private element: HTMLElement;
|
||||||
|
private $parent: Element;
|
||||||
|
private $refElem: Element;
|
||||||
|
|
||||||
error: any;
|
error: any;
|
||||||
specLoaded: boolean;
|
specLoaded: boolean;
|
||||||
|
@ -53,6 +56,9 @@ export class Redoc extends BaseComponent implements OnInit {
|
||||||
optionsMgr.options = Redoc._preOptions || {};
|
optionsMgr.options = Redoc._preOptions || {};
|
||||||
|
|
||||||
this.element = elementRef.nativeElement;
|
this.element = elementRef.nativeElement;
|
||||||
|
this.$parent = this.element.parentElement;
|
||||||
|
this.$refElem = this.element.nextElementSibling;
|
||||||
|
|
||||||
//parse options (top level component doesn't support inputs)
|
//parse options (top level component doesn't support inputs)
|
||||||
optionsMgr.parseOptions( this.element );
|
optionsMgr.parseOptions( this.element );
|
||||||
let scrollParent = detectScollParent( this.element );
|
let scrollParent = detectScollParent( this.element );
|
||||||
|
@ -121,4 +127,9 @@ export class Redoc extends BaseComponent implements OnInit {
|
||||||
}
|
}
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngOnDestroy() {
|
||||||
|
let $clone = this.element.cloneNode();
|
||||||
|
this.$parent.insertBefore($clone, this.$refElem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import { Component, ElementRef, ChangeDetectorRef, OnInit } from '@angular/core';
|
import { Component, ElementRef, ChangeDetectorRef, OnInit, OnDestroy } from '@angular/core';
|
||||||
|
|
||||||
//import { global } from '@angular/core/src/facade/lang';
|
//import { global } from '@angular/core/src/facade/lang';
|
||||||
import { trigger, state, animate, transition, style } from '@angular/core';
|
import { trigger, state, animate, transition, style } from '@angular/core';
|
||||||
|
@ -28,7 +28,7 @@ const global = window;
|
||||||
])
|
])
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class SideMenu extends BaseComponent implements OnInit {
|
export class SideMenu extends BaseComponent implements OnInit, OnDestroy {
|
||||||
activeCatCaption: string;
|
activeCatCaption: string;
|
||||||
activeItemCaption: string;
|
activeItemCaption: string;
|
||||||
categories: Array<MenuCategory>;
|
categories: Array<MenuCategory>;
|
||||||
|
@ -123,6 +123,11 @@ export class SideMenu extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
this.scrollService.unbind();
|
this.scrollService.unbind();
|
||||||
|
this.menuService.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy() {
|
||||||
|
this.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
|
|
@ -33,7 +33,6 @@ export function init(specUrl:string, options:any = {}) {
|
||||||
moduleRef = appRef;
|
moduleRef = appRef;
|
||||||
console.log('ReDoc initialized!');
|
console.log('ReDoc initialized!');
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
//Redoc.displayError(err);
|
|
||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
import { Injectable, EventEmitter } from '@angular/core';
|
import { Injectable, EventEmitter } from '@angular/core';
|
||||||
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
||||||
import { ScrollService, INVIEW_POSITION } from './scroll.service';
|
import { ScrollService, INVIEW_POSITION } from './scroll.service';
|
||||||
import { Hash } from './hash.service';
|
import { Hash } from './hash.service';
|
||||||
|
@ -16,6 +17,8 @@ const CHANGE = {
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class MenuService {
|
export class MenuService {
|
||||||
|
private _hashSubscription: Subscription;
|
||||||
|
|
||||||
changed: EventEmitter<any> = new EventEmitter();
|
changed: EventEmitter<any> = new EventEmitter();
|
||||||
ready: BehaviorSubject<boolean> = new BehaviorSubject(false);
|
ready: BehaviorSubject<boolean> = new BehaviorSubject(false);
|
||||||
categories: Array<MenuCategory>;
|
categories: Array<MenuCategory>;
|
||||||
|
@ -39,7 +42,7 @@ export class MenuService {
|
||||||
|
|
||||||
//this.changeActive(CHANGE.INITIAL);
|
//this.changeActive(CHANGE.INITIAL);
|
||||||
|
|
||||||
this.hash.value.subscribe((hash) => {
|
this._hashSubscription = this.hash.value.subscribe((hash) => {
|
||||||
if (hash == undefined) return;
|
if (hash == undefined) return;
|
||||||
this.setActiveByHash(hash);
|
this.setActiveByHash(hash);
|
||||||
if (!this.tasks.empty) {
|
if (!this.tasks.empty) {
|
||||||
|
@ -228,4 +231,8 @@ export class MenuService {
|
||||||
}
|
}
|
||||||
this.activate(catIdx, methodIdx);
|
this.activate(catIdx, methodIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
destroy() {
|
||||||
|
this._hashSubscription.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user