angular2-6 修改ngx-weui 的infiniteloader实现吸顶效果

主要修改compontent组件,为其加入吸顶监听

export class InfiniteloaderComponent implements OnChanges, OnInit, AfterViewInit, OnDestroy {

  private didScroll = false;
  private scrollEvent: any = null;
  private scrollTime: any = null;
  private disposeScroller: Subscription;

  _loading: boolean = false;
  _finished: boolean = false;

  /**
   * 吸顶元素
   */
  toTopElement: any;
  /**
   * 吸顶元素原始距离顶部距离
   */
  toTop: number;

  /**
   * 配置项
   */
  @Input() config: TxInfiniteLoaderConfig;

  /**
   * 吸顶id
   */
  @Input() toTopId;

  /**
   * 加载更多回调
   */
  @Output() loadmore = new EventEmitter<TxInfiniteloaderComponent>();

  constructor(
    private el: ElementRef,
    private zone: NgZone,
    private DEF: TxInfiniteLoaderConfig,
    private renderer2: Renderer2
  ) { }

  /** 设置本次加载完成 */
  resolveLoading() {
    this._loading = false;
    this._finished = false;
  }

  /** 设置结束 */
  setFinished() {
    this._loading = false;
    this._finished = true;
  }

  /** 设置重新开始 */
  restart() {
    this._finished = false;
  }

  _onScroll() {

    if (this._loading || this._finished) {
      return;
    }
    const target = this.scrollEvent.target;
    const scrollPercent = Math.floor(
      (target.scrollTop + target.clientHeight) / target.scrollHeight * 100,
    );

    if (scrollPercent > this.config.percent) {
      this._loading = true;
      this.loadmore.emit(this);
    }

  }

  _fixedListener() {
    /**
    * 元素吸顶
    */
    if (this.toTopElement != null) {
      if (this.scrollEvent.target.scrollTop >= this.toTop) {
        this.renderer2.setStyle(this.toTopElement, 'position', 'fixed');
      } else {
        this.renderer2.setStyle(this.toTopElement, 'position', 'static');
      }
    }
  }

  ngOnInit() {
    this.parseConfig();

    this.scrollTime = setInterval(() => {
      if (this.didScroll) {
        this.didScroll = false;
        this._onScroll();
      }
    }, this.config.throttle);

    this.disposeScroller = fromEvent(
      this.el.nativeElement.querySelector('.weui-infiniteloader__content'),
      'scroll',
    ).subscribe(($event: any) => {
      this.scrollEvent = $event;
      this.didScroll = true;
      this._fixedListener();
    });
  }

  ngOnChanges(changes: SimpleChanges): void {
    if ('config' in changes) {
      this.parseConfig();
    }
  }

  ngAfterViewInit() {
    setTimeout(() => {
      this.toTopElement = this.el.nativeElement.querySelector('#' + this.toTopId);
      if (this.toTopElement === null) {
        return;
      }
      this.toTop = this.toTopElement.offsetTop;
    }, 0);
  }

  ngOnDestroy(): void {
    if (this.scrollTime) {
      clearTimeout(this.scrollTime);
    }
    if (this.disposeScroller) {
      this.disposeScroller.unsubscribe();
    }
  }

  private parseConfig() {
    this.config = Object.assign({}, this.DEF, this.config);
  }

}

普通吸顶指令实现 Angular2-6 实现吸顶效果指令

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值