From a3d60a3549b290c8db9d9aff6ad13c8af4ae1a2e Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Mon, 21 Dec 2015 21:39:27 +0200 Subject: [PATCH] refactor and fix side-menu --- lib/components/SideMenu/side-menu.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/components/SideMenu/side-menu.js b/lib/components/SideMenu/side-menu.js index 1deb1d6a..ade59878 100644 --- a/lib/components/SideMenu/side-menu.js +++ b/lib/components/SideMenu/side-menu.js @@ -4,6 +4,7 @@ import {RedocComponent, BaseComponent} from '../base'; import {NgZone, ChangeDetectionStrategy} from 'angular2/core'; import {redocEvents} from '../../events'; import detectScollParent from 'scrollparent'; +import {document} from 'angular2/src/facade/browser'; import {BrowserDomAdapter} from 'angular2/platform/browser'; import {global} from 'angular2/src/facade/lang'; @@ -22,15 +23,16 @@ const INVIEW_POSITION = { @RedocComponent({ selector: 'side-menu', + providers: [BrowserDomAdapter], templateUrl: './lib/components/SideMenu/side-menu.html', styleUrls: ['./lib/components/SideMenu/side-menu.css'], changeDetection: ChangeDetectionStrategy.Default }) export default class SideMenu extends BaseComponent { - constructor(schemaMgr, zone) { + constructor(schemaMgr, adapter, zone) { super(schemaMgr); this.zone = zone; - this.adapter = new BrowserDomAdapter(); + this.adapter = adapter; this.scrollParent = detectScollParent(document.querySelector('methods-list')); @@ -51,7 +53,7 @@ export default class SideMenu extends BaseComponent { } hashScroll(evt) { - let hash = global.location.hash; + let hash = this.adapter.getLocation().hash; if (!hash) return; hash = hash.substr(1); @@ -64,10 +66,16 @@ export default class SideMenu extends BaseComponent { bindEvents() { this.prevOffsetY = this.scrollY(); - let view = document.querySelector('redoc'); - this.viewBoxTop = view.offsetTop; - this.adapter.on(this.scrollParent, 'scroll', () => this.scrollHandler()); - this.adapter.on(global, 'hashchange', evt => this.hashScroll(evt)); + this.viewBoxTop = this.scrollParent.offsetTop || 0; + this._cancel = {}; + this._cancel.scroll = this.adapter.onAndCancel(this.scrollParent, 'scroll', () => { this.scrollHandler(); }); + this._cancel.hash = this.adapter.onAndCancel(global, 'hashchange', evt => this.hashScroll(evt)); + } + + destroy() { + this._cancel.scroll(); + this._cancel.hash(); + console.log('destroyed'); } activateAndScroll(idx, methodIdx) { @@ -76,6 +84,7 @@ export default class SideMenu extends BaseComponent { } scrollTo(el) { + // TODO: rewrite this to use offsetTop as more reliable solution let subjRect = el.getBoundingClientRect(); let offset = this.scrollY() + subjRect.top - this.viewBoxTop + 1; if (this.scrollParent.scrollTo) { @@ -196,4 +205,4 @@ export default class SideMenu extends BaseComponent { this.changeActive(CHANGE.INITIAL); } } -SideMenu.parameters = SideMenu.parameters.concat([NgZone]); +SideMenu.parameters = SideMenu.parameters.concat([[BrowserDomAdapter], [NgZone]]);