Angular PrimeNG Table sticky 사례
PrimeNG Table Sticky 사용 방법
Angular8
와 RxJS6
버전에 호환되는 문제가 있는데 주로 RxJS6
가 많다breaking changes
. 다음에 자신이 검증한 코드가 붙어있다. - 2019년 7월 30일 13:15:31
import { Directive, Input, Renderer, ElementRef, AfterViewInit, OnDestroy, OnChanges } from '@angular/core';
import { Subscription,fromEvent } from 'rxjs';
@Directive({
selector: '[stickyHeader]'
})
export class StickyHeaderDirective implements AfterViewInit, OnDestroy, OnChanges{
private windowScrollSubscription: Subscription = null;
private windowResizeSubscription: Subscription = null;
private header: any = null;
private offsetTop: number = 0;
private lastScroll: number = 0;
private isSticky: boolean = false;
private hasHeader: boolean = false;
private headerTop = 0;
@Input('stickyClass') stickyClass: string = "";
@Input('stickyTop') stickyTop: number = 0;
constructor(private elementRef: ElementRef, private renderer: Renderer) {
}
ngAfterViewInit(): void {
setTimeout(()=>{
this.windowScrollSubscription = fromEvent(window, 'scroll').subscribe(() => this.manageScrollEvent());
this.windowResizeSubscription = fromEvent(window, 'resize').subscribe(() => this.updateHeaderSize());
const headers = this.elementRef.nativeElement.getElementsByTagName('TR');
this.hasHeader = headers.length > 0;
if (this.hasHeader) {
this.header = headers[0];
this.headerTop = this.header.getBoundingClientRect()['top'];
this._calcPosition();
}
}, 0);
}
ngOnDestroy(): void {
if (this.windowScrollSubscription){
this.windowScrollSubscription.unsubscribe();
this.windowScrollSubscription = null;
}
if (this.windowResizeSubscription){
this.windowResizeSubscription.unsubscribe();
this.windowResizeSubscription = null;
}
}
ngOnChanges(changes)
{
if (changes.stickyTop) {
this._calcPosition();
}
}
private _calcPosition(){
if (this.hasHeader) {
const scroll = window.pageYOffset;
if (this.isSticky && scroll >= this.headerTop) {
this.header.style.top = this.stickyTop + 'px';
}
}
}
private manageScrollEvent(): void {
const scroll = window.pageYOffset;
if (scroll > this.lastScroll && !this.isSticky && scroll >= this.offsetTop) {
this.setSticky();
} else if (scroll < this.lastScroll && this.isSticky && scroll <= this.offsetTop) {
this.unsetSticky();
}
this.lastScroll = scroll;
}
private setSticky(): void {
this.isSticky = true;
this.header.style.position = 'fixed';
this.header.style.top = this.stickyTop + 'px';
this.header.style.display = 'table';
this.updateHeaderSize();
this.setClass(true);
}
private updateHeaderSize(){
if (this.isSticky) {
const tableWidth = this.elementRef.nativeElement.getBoundingClientRect()['right'] - this.elementRef.nativeElement.getBoundingClientRect()['left'];
this.header.style.width = tableWidth + 'px';
// update size of TH elements
const thArray = this.elementRef.nativeElement.getElementsByTagName('TH');
for (let i = 0; i < thArray.length; i++){
thArray[i].style.width = tableWidth / thArray.length + "px";
}
}
}
private unsetSticky(): void {
this.isSticky = false;
this.header.style.position = 'static';
this.header.style.width = 'auto';
this.header.style.display = 'table-row';
this.setClass(false);
}
private setStyle(key: string, value: string): void {
this.renderer.setElementStyle(this.header, key, value);
}
private setClass(add: boolean): void {
if (this.stickyClass){
this.renderer.setElementClass(this.header, this.stickyClass, add);
}
}
}
sticky
명령: [stickyTop]=50
은 밑에 있는 열 헤더의 예를 지정할 수 있습니다.css
스타일: .header{
height: 50px;
width: 100%;
background-color:cornflowerblue;
color: white;
font-size: 16px;
font-weight: bold;
font-family: Arial;
line-height: 50px;
text-align: center;
border-bottom: 1px solid #666666;
position: fixed;
z-index: 1;
top: 0px;
}
p-dataTable{
margin-left: 20px;
margin-top: 50px;
margin-right: 20px;
display: block;
}
:host /deep/ p-datatable .stickyHeader{
box-shadow: 2px 2px 1px #888888;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Angular PrimeNG Table sticky 사례PrimeNG Table Sticky 사용 방법 먼저 불평, 정부에서 준 코드가 Angular8와 RxJS6 버전에 호환되는 문제가 있는데 주로 RxJS6가 많다breaking changes. 다음에 자신이 검증한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.