ng-devui
Version:
DevUI components based on Angular
99 lines • 12.6 kB
JavaScript
import { Directive, forwardRef, HostBinding, HostListener, Inject, Input } from '@angular/core';
import { scrollAnimate } from 'ng-devui/utils';
import { AnchorBoxDirective } from './anchor-box.directive';
import * as i0 from "@angular/core";
import * as i1 from "./anchor-box.directive";
export class AnchorLinkDirective {
get anchorActiveClass() {
return this.anchorBlock && this.anchorBlock.isActive ? this.anchorActive || '' : '';
}
set anchorName(anchor) {
this._anchorName = anchor;
this.bindAnchorAfterBoxReady();
}
get anchorName() {
return this._anchorName;
}
constructor(box) {
this.bindAnchorAfterBoxReady = () => {
if (this.boxElement.anchorMap) {
setTimeout(() => {
this.anchorBlock = this.boxElement.anchorMap[this.anchorName];
}, 0);
}
else {
this.bindingAnchorTimer = setTimeout(this.bindAnchorAfterBoxReady, 500);
}
};
this.boxElement = box;
}
ngOnInit() {
this.subscribeAnchorMapChange();
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
subscribeAnchorMapChange() {
if (this.boxElement) {
this.subscription = this.boxElement.refreshAnchorMap.subscribe(() => {
if (this.bindingAnchorTimer) {
clearTimeout(this.bindingAnchorTimer);
this.bindingAnchorTimer = undefined;
}
this.bindAnchorAfterBoxReady();
});
}
}
scrollToAnchor(activeChangeBy) {
if (typeof document === 'undefined') {
return;
}
if (!this.anchorBlock) {
return;
}
const callback = () => {
setTimeout(() => {
this.boxElement.forceActiveAnchor(this.anchorName, activeChangeBy || 'anchor-link');
this.boxElement.isScrollingToTarget = false;
}, 120);
};
((container, anchor) => {
let containerScrollTop = container.scrollTop;
let containerOffsetTop = container.getBoundingClientRect().top;
if (container === document.documentElement) {
containerScrollTop += document.body.scrollTop; // scrollTop兼容性问题
containerOffsetTop = 0; // offsettop抵消
}
scrollAnimate(container, containerScrollTop, containerScrollTop +
anchor.getBoundingClientRect().top -
containerOffsetTop -
((this.boxElement.view && this.boxElement.view.top) || 0), undefined, undefined, callback);
})(this.boxElement.scrollTarget || document.documentElement, this.anchorBlock.element);
this.boxElement.isScrollingToTarget = true;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, deps: [{ token: forwardRef(() => AnchorBoxDirective) }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: AnchorLinkDirective, selector: "[dAnchorLink]", inputs: { anchorName: ["dAnchorLink", "anchorName"], anchorActive: "anchorActive" }, host: { listeners: { "click": "scrollToAnchor()" }, properties: { "class": "this.anchorActiveClass" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, decorators: [{
type: Directive,
args: [{
selector: '[dAnchorLink]',
}]
}], ctorParameters: () => [{ type: i1.AnchorBoxDirective, decorators: [{
type: Inject,
args: [forwardRef(() => AnchorBoxDirective)]
}] }], propDecorators: { anchorActiveClass: [{
type: HostBinding,
args: ['class']
}], anchorName: [{
type: Input,
args: ['dAnchorLink']
}], anchorActive: [{
type: Input
}], scrollToAnchor: [{
type: HostListener,
args: ['click']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLWxpbmsuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvYW5jaG9yL2FuY2hvci1saW5rLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBTzVELE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsSUFBMEIsaUJBQWlCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0RixDQUFDO0lBRUQsSUFDSSxVQUFVLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFTRCxZQUEwRCxHQUF1QjtRQTBCakYsNEJBQXVCLEdBQUcsR0FBRyxFQUFFO1lBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDaEUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1Is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bUdBckI3QyxtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7aUJBQzFCOzswQkFzQmMsTUFBTTsyQkFBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUM7eUNBcEI5QixpQkFBaUI7c0JBQTFDLFdBQVc7dUJBQUMsT0FBTztnQkFLaEIsVUFBVTtzQkFEYixLQUFLO3VCQUFDLGFBQWE7Z0JBU1gsWUFBWTtzQkFBcEIsS0FBSztnQkE0Q04sY0FBYztzQkFEYixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzY3JvbGxBbmltYXRlIH0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xuaW1wb3J0IHsgQW5jaG9yQm94RGlyZWN0aXZlIH0gZnJvbSAnLi9hbmNob3ItYm94LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBbmNob3JEaXJlY3RpdmUgfSBmcm9tICcuL2FuY2hvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQW5jaG9yQWN0aXZlQ2hhbmdlU291cmNlIH0gZnJvbSAnLi9hbmNob3IudHlwZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkQW5jaG9yTGlua10nLFxufSlcbmV4cG9ydCBjbGFzcyBBbmNob3JMaW5rRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgZ2V0IGFuY2hvckFjdGl2ZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmFuY2hvckJsb2NrICYmIHRoaXMuYW5jaG9yQmxvY2suaXNBY3RpdmUgPyB0aGlzLmFuY2hvckFjdGl2ZSB8fCAnJyA6ICcnO1xuICB9XG4gIHByaXZhdGUgX2FuY2hvck5hbWU7XG4gIEBJbnB1dCgnZEFuY2hvckxpbmsnKVxuICBzZXQgYW5jaG9yTmFtZShhbmNob3I6IHN0cmluZykge1xuICAgIHRoaXMuX2FuY2hvck5hbWUgPSBhbmNob3I7XG4gICAgdGhpcy5iaW5kQW5jaG9yQWZ0ZXJCb3hSZWFkeSgpO1xuICB9XG4gIGdldCBhbmNob3JOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JOYW1lO1xuICB9XG5cbiAgQElucHV0KCkgYW5jaG9yQWN0aXZlOiBzdHJpbmc7XG5cbiAgYm94RWxlbWVudDogQW5jaG9yQm94RGlyZWN0aXZlO1xuICBhbmNob3JCbG9jazogQW5jaG9yRGlyZWN0aXZlO1xuICBiaW5kaW5nQW5jaG9yVGltZXI7XG4gIHN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gQW5jaG9yQm94RGlyZWN0aXZlKSkgYm94OiBBbmNob3JCb3hEaXJlY3RpdmUpIHtcbiAgICB0aGlzLmJveEVsZW1lbnQgPSBib3g7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN1YnNjcmliZUFuY2hvck1hcENoYW5nZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZUFuY2hvck1hcENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5ib3hFbGVtZW50KSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuYm94RWxlbWVudC5yZWZyZXNoQW5jaG9yTWFwLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdBbmNob3JUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJpbmRpbmdBbmNob3JUaW1lcik7XG4gICAgICAgICAgdGhpcy5iaW5kaW5nQW5jaG9yVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kQW5jaG9yQWZ0ZXJCb3hSZWFkeSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYmluZEFuY2hvckFmdGVyQm94UmVhZHkgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuYm94RWxlbWVudC5hbmNob3JNYXApIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFuY2hvckJsb2NrID0gdGhpcy5ib3hFbGVtZW50LmFuY2hvck1hcFt0aGlzLmFuY2hvck5hbWVdO1xuICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmluZGluZ0FuY2hvclRpbWVyID0gc2V0VGltZW91dCh0aGlzLmJpbmRBbmNob3JBZnRlckJveFJlYWR5LCA1MDApO1xuICAgIH1cbiAgfTtcblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIHNjcm9sbFRvQW5jaG9yKGFjdGl2ZUNoYW5nZUJ5PzogQW5jaG9yQWN0aXZlQ2hhbmdlU291cmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFuY2hvckJsb2NrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYm94RWxlbWVudC5mb3JjZUFjdGl2ZUFuY2hvcih0aGlzLmFuY2hvck5hbWUsIGFjdGl2ZUNoYW5nZUJ5IHx8ICdhbmNob3ItbGluaycpO1xuICAgICAgICB0aGlzLmJveEVsZW1lbnQuaXNTY3JvbGxpbmdUb1RhcmdldCA9IGZhbHNlO1xuICAgICAgfSwgMTIwKTtcbiAgICB9O1xuICAgICgoY29udGFpbmVyOiBFbGVtZW50LCBhbmNob3I6IEVsZW1lbnQpID0+IHtcbiAgICAgIGxldCBjb250YWluZXJTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgICAgbGV0IGNvbnRhaW5lck9mZnNldFRvcCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICBpZiAoY29udGFpbmVyID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgY29udGFpbmVyU2Nyb2xsVG9wICs9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOyAvLyBzY3JvbGxUb3DlhbzlrrnmgKfpl67pophcbiAgICAgICAgY29udGFpbmVyT2Zmc2V0VG9wID0gMDsgLy8gb2Zmc2V0dG9w5oq15raIXG4gICAgICB9XG4gICAgICBzY3JvbGxBbmltYXRlKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGNvbnRhaW5lclNjcm9sbFRvcCxcbiAgICAgICAgY29udGFpbmVyU2Nyb2xsVG9wICtcbiAgICAgICAgICBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC1cbiAgICAgICAgICBjb250YWluZXJPZmZzZXRUb3AgLVxuICAgICAgICAgICgodGhpcy5ib3hFbGVtZW50LnZpZXcgJiYgdGhpcy5ib3hFbGVtZW50LnZpZXcudG9wKSB8fCAwKSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICApO1xuICAgIH0pKHRoaXMuYm94RWxlbWVudC5zY3JvbGxUYXJnZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLmFuY2hvckJsb2NrLmVsZW1lbnQpO1xuICAgIHRoaXMuYm94RWxlbWVudC5pc1Njcm9sbGluZ1RvVGFyZ2V0ID0gdHJ1ZTtcbiAgfVxufVxuIl19