@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
210 lines • 17.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: anchor-link.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, forwardRef, HostListener, Inject, Input, HostBinding } from '@angular/core';
import { AnchorBoxDirective } from './anchor-box.directive';
export class AnchorLinkDirective {
/**
* @param {?} box
*/
constructor(box) {
this.bindAnchorAfterBoxReady = (/**
* @return {?}
*/
() => {
if (this.boxElement.anchorMap) {
setTimeout((/**
* @return {?}
*/
() => { this.anchorBlock = this.boxElement.anchorMap[this.anchorName]; }), 0);
}
else {
this.bindingAnchorTimer = setTimeout(this.bindAnchorAfterBoxReady, 500);
}
});
this.boxElement = box;
}
/**
* @return {?}
*/
get anchorActiveClass() {
return (this.anchorBlock && this.anchorBlock.isActive) ? (this.anchorActive || '') : '';
}
/**
* @param {?} anchor
* @return {?}
*/
set anchorName(anchor) {
this._anchorName = anchor;
this.bindAnchorAfterBoxReady();
}
/**
* @return {?}
*/
get anchorName() { return this._anchorName; }
/**
* @return {?}
*/
ngOnInit() {
this.subscribeAnchorMapChange();
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
/**
* @return {?}
*/
subscribeAnchorMapChange() {
if (this.boxElement) {
this.subscription = this.boxElement.refreshAnchorMap.subscribe((/**
* @return {?}
*/
() => {
if (this.bindingAnchorTimer) {
clearTimeout(this.bindingAnchorTimer);
this.bindingAnchorTimer = undefined;
}
this.bindAnchorAfterBoxReady();
}));
}
}
/**
* @return {?}
*/
scrollToAnchor() {
if (!this.anchorBlock) {
return;
}
/** @type {?} */
const callback = (/**
* @return {?}
*/
() => {
setTimeout((/**
* @return {?}
*/
() => { this.boxElement.forceActiveAnchor(this.anchorName, 'anchor-link'); }), 120);
});
((/**
* @param {?} container
* @param {?} anchor
* @return {?}
*/
(container, anchor) => {
/** @type {?} */
let containerScrollTop = container.scrollTop;
if (container === document.documentElement) {
containerScrollTop += document.body.scrollTop;
}
this.scrollAnimate(container, containerScrollTop, (containerScrollTop + anchor.getBoundingClientRect().top - (this.boxElement.view && this.boxElement.view.top || 0)), undefined, undefined, callback);
}))(this.boxElement.scrollTarget || document.documentElement, this.anchorBlock.element);
}
/**
* @param {?} target
* @param {?} currentTopValue
* @param {?} targetTopValue
* @param {?=} timeGap
* @param {?=} scrollTime
* @param {?=} callback
* @return {?}
*/
scrollAnimate(target, currentTopValue, targetTopValue, timeGap = 40, scrollTime = 450, callback) {
/** @type {?} */
const startTimeStamp = Date.now();
/** @type {?} */
const drawAnimateFrame = (/**
* @return {?}
*/
() => {
/** @type {?} */
const currentTime = Date.now() - startTimeStamp;
if (currentTime - timeGap > scrollTime) {
target.scrollTop = targetTopValue;
if (target === document.documentElement) {
// 兼容写法,老浏览器/老API模式需要document.body滚动,新的需要documentElement滚动
document.body.scrollTop = targetTopValue;
}
if (callback) {
callback();
}
}
else {
/** @type {?} */
const tempTopValue = this.easeInOutCubic(currentTime, currentTopValue, targetTopValue, scrollTime);
target.scrollTop = tempTopValue;
if (target === document.documentElement) {
document.body.scrollTop = tempTopValue;
}
setTimeout((/**
* @return {?}
*/
() => { requestAnimationFrame(drawAnimateFrame); }), timeGap);
}
});
requestAnimationFrame(drawAnimateFrame);
}
/**
* @param {?} t
* @param {?} b
* @param {?} c
* @param {?} d
* @return {?}
*/
easeInOutCubic(t, b, c, d) {
/** @type {?} */
const cc = c - b;
/** @type {?} */
let tt = t / (d / 2);
if (tt < 1) {
return cc / 2 * tt * tt * tt + b;
}
else {
return cc / 2 * ((tt -= 2) * tt * tt + 2) + b;
}
}
}
AnchorLinkDirective.decorators = [
{ type: Directive, args: [{
selector: '[dAnchorLink]',
},] }
];
/** @nocollapse */
AnchorLinkDirective.ctorParameters = () => [
{ type: AnchorBoxDirective, decorators: [{ type: Inject, args: [forwardRef((/**
* @return {?}
*/
() => AnchorBoxDirective)),] }] }
];
AnchorLinkDirective.propDecorators = {
anchorActiveClass: [{ type: HostBinding, args: ['class',] }],
anchorName: [{ type: Input, args: ['dAnchorLink',] }],
anchorActive: [{ type: Input }],
scrollToAnchor: [{ type: HostListener, args: ['click',] }]
};
if (false) {
/**
* @type {?}
* @private
*/
AnchorLinkDirective.prototype._anchorName;
/** @type {?} */
AnchorLinkDirective.prototype.anchorActive;
/** @type {?} */
AnchorLinkDirective.prototype.boxElement;
/** @type {?} */
AnchorLinkDirective.prototype.anchorBlock;
/** @type {?} */
AnchorLinkDirective.prototype.bindingAnchorTimer;
/** @type {?} */
AnchorLinkDirective.prototype.subscription;
/** @type {?} */
AnchorLinkDirective.prototype.bindAnchorAfterBoxReady;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLWxpbmsuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvYW5jaG9yLyIsInNvdXJjZXMiOlsiYW5jaG9yLWxpbmsuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUs1RCxNQUFNLE9BQU8sbUJBQW1COzs7O0lBbUI5QixZQUEwRCxHQUF1QjtRQTBCakYsNEJBQXVCOzs7UUFBRyxHQUFHLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtnQkFDN0IsVUFBVTs7O2dCQUFDLEdBQUcsRUFBRSxHQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3hGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ3pFO1FBQ0gsQ0FBQyxFQUFBO1FBL0JHLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO0lBQzFCLENBQUM7Ozs7SUFwQkQsSUFBMEIsaUJBQWlCO1FBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFGLENBQUM7Ozs7O0lBRUQsSUFDSSxVQUFVLENBQUMsTUFB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O2dDQWxCdkQsV0FBVyxTQUFDLE9BQU87eUJBSW5CLEtBQUssU0FBQyxhQUFhOzJCQU9uQixLQUFLOzZCQXlDTCxZQUFZLFNBQUUsT0FBTzs7Ozs7OztJQWpEdEIsMENBQW9COztJQVFwQiwyQ0FBOEI7O0lBRTlCLHlDQUErQjs7SUFDL0IsMENBQTZCOztJQUM3QixpREFBbUI7O0lBQ25CLDJDQUFhOztJQTRCYixzREFNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQW5jaG9yRGlyZWN0aXZlIH0gZnJvbSAnLi9hbmNob3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQW5jaG9yQm94RGlyZWN0aXZlIH0gZnJvbSAnLi9hbmNob3ItYm94LmRpcmVjdGl2ZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkQW5jaG9yTGlua10nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5jaG9yTGlua0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgZ2V0IGFuY2hvckFjdGl2ZUNsYXNzKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmFuY2hvckJsb2NrICYmIHRoaXMuYW5jaG9yQmxvY2suaXNBY3RpdmUpID8gKHRoaXMuYW5jaG9yQWN0aXZlIHx8ICcnKSA6ICcnO1xyXG4gIH1cclxuICBwcml2YXRlIF9hbmNob3JOYW1lO1xyXG4gIEBJbnB1dCgnZEFuY2hvckxpbmsnKVxyXG4gIHNldCBhbmNob3JOYW1lKGFuY2hvcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9hbmNob3JOYW1lID0gYW5jaG9yO1xyXG4gICAgdGhpcy5iaW5kQW5jaG9yQWZ0ZXJCb3hSZWFkeSgpO1xyXG4gIH1cclxuICBnZXQgYW5jaG9yTmFtZSgpIHsgcmV0dXJuIHRoaXMuX2FuY2hvck5hbWU7IH1cclxuXHJcbiAgQElucHV0KCkgYW5jaG9yQWN0aXZlOiBzdHJpbmc7XHJcblxyXG4gIGJveEVsZW1lbnQ6IEFuY2hvckJveERpcmVjdGl2ZTtcclxuICBhbmNob3JCbG9jazogQW5jaG9yRGlyZWN0aXZlO1xyXG4gIGJpbmRpbmdBbmNob3JUaW1lcjtcclxuICBzdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBBbmNob3JCb3hEaXJlY3RpdmUpKSBib3g6IEFuY2hvckJveERpcmVjdGl2ZSkge1xyXG4gICAgICB0aGlzLmJveEVsZW1lbnQgPSBib3g7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVBbmNob3JNYXBDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgICBpZiAoIHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVBbmNob3JNYXBDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5ib3hFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5ib3hFbGVtZW50LnJlZnJlc2hBbmNob3JNYXAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5iaW5kaW5nQW5jaG9yVGltZXIpIHtcclxuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJpbmRpbmdBbmNob3JUaW1lcik7XHJcbiAgICAgICAgICB0aGlzLmJpbmRpbmdBbmNob3JUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5iaW5kQW5jaG9yQWZ0ZXJCb3hSZWFkeSgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJpbmRBbmNob3JBZnRlckJveFJlYWR5ID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuYm94RWxlbWVudC5hbmNob3JNYXApIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7dGhpcy5hbmNob3JCbG9jayA9IHRoaXMuYm94RWxlbWVudC5hbmNob3JNYXBbdGhpcy5hbmNob3JOYW1lXTsgfSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJpbmRpbmdBbmNob3JUaW1lciA9IHNldFRpbWVvdXQodGhpcy5iaW5kQW5jaG9yQWZ0ZXJCb3hSZWFkeSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIgKCdjbGljaycpXHJcbiAgc2Nyb2xsVG9BbmNob3IoKSB7XHJcbiAgICBpZiAoICF0aGlzLmFuY2hvckJsb2NrKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5ib3hFbGVtZW50LmZvcmNlQWN0aXZlQW5jaG9yKHRoaXMuYW5jaG9yTmFtZSwgJ2FuY2hvci1saW5rJyk7IH0sIDEyMCk7XHJcbiAgICB9O1xyXG4gICAgKChjb250YWluZXI6IEVsZW1lbnQsIGFuY2hvcjogRWxlbWVudCkgPT4ge1xyXG4gICAgICBsZXQgY29udGFpbmVyU2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgaWYgKGNvbnRhaW5lciA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgY29udGFpbmVyU2Nyb2xsVG9wICs9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2Nyb2xsQW5pbWF0ZShcclxuICAgICAgICBjb250YWluZXIsXHJcbiAgICAgICAgY29udGFpbmVyU2Nyb2xsVG9wLFxyXG4gICAgICAgIChjb250YWluZXJTY3JvbGxUb3AgKyBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gKHRoaXMuYm94RWxlbWVudC52aWV3ICYmIHRoaXMuYm94RWxlbWVudC52aWV3LnRvcCB8fCAwKSksXHJcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNhbGxiYWNrXHJcbiAgICAgICk7XHJcbiAgICB9KSggdGhpcy5ib3hFbGVtZW50LnNjcm9sbFRhcmdldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHRoaXMuYW5jaG9yQmxvY2suZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBzY3JvbGxBbmltYXRlKHRhcmdldCwgY3VycmVudFRvcFZhbHVlLCB0YXJnZXRUb3BWYWx1ZSwgdGltZUdhcDogbnVtYmVyID0gNDAsIHNjcm9sbFRpbWU6IG51bWJlciA9IDQ1MCwgY2FsbGJhY2s/KSB7XHJcbiAgICBjb25zdCBzdGFydFRpbWVTdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCBkcmF3QW5pbWF0ZUZyYW1lID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWVTdGFtcDtcclxuICAgICAgaWYgKGN1cnJlbnRUaW1lIC0gdGltZUdhcCA+IHNjcm9sbFRpbWUgKSB7XHJcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldFRvcFZhbHVlO1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgLy8g5YW85a655YaZ5rOV77yM6ICB5rWP6KeI5ZmoL+iAgUFQSeaooeW8j+mcgOimgWRvY3VtZW50LmJvZHnmu5rliqjvvIzmlrDnmoTpnIDopoFkb2N1bWVudEVsZW1lbnTmu5rliqhcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gdGFyZ2V0VG9wVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCB0ZW1wVG9wVmFsdWUgPSB0aGlzLmVhc2VJbk91dEN1YmljKGN1cnJlbnRUaW1lLCBjdXJyZW50VG9wVmFsdWUsIHRhcmdldFRvcFZhbHVlLCBzY3JvbGxUaW1lKTtcclxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGVtcFRvcFZhbHVlO1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSB0ZW1wVG9wVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge3JlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3QW5pbWF0ZUZyYW1lKTsgfSwgdGltZUdhcCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZHJhd0FuaW1hdGVGcmFtZSk7XHJcbiAgfVxyXG5cclxuICBlYXNlSW5PdXRDdWJpYyh0OiBudW1iZXIsIGI6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgY2MgPSBjIC0gYjtcclxuICAgIGxldCB0dCA9IHQgLyAoZCAvIDIpO1xyXG4gICAgaWYgKHR0IDwgMSkge1xyXG4gICAgICByZXR1cm4gY2MgLyAyICogdHQgKiB0dCAqIHR0ICsgYjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBjYyAvIDIgKiAoKHR0IC09IDIpICogdHQgKiB0dCArIDIpICsgYjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19