这篇介绍一下,写一个自己的angular2滚动监听插件
目录结构:
/scrollModule:
ztw-scroll.module.ts;
scrollBind.directive.ts;
scroll.directive.ts;
scroll.service.ts;
使用:
({ template:` <div ztwScrollBind> //ztwScrollBind用于监听body的scroll行为,可以绑定在任何一个组件上。 <div class=‘block‘ *ngFor=‘let block of blocks‘ (scrolled)=‘scrolled($event)‘ //滚动进入时触发。 (leaved)=‘leaved($evnet)‘ //离开时触发。 ztwScrollControl> </div> </div> ` }) export class component{ this.blocks=[1,2,3] scrolled(e){ if(!e.target) return; } leaved(e){ } }
ztw-scroll.module.ts:
import {NgModule} from ‘@angular/core‘; import {ScrollDirective} from ‘./scroll.directive‘; import {ScrollService} from ‘./scroll.service‘; import {ScrollBindDirective} from ‘./scrollBind.directive‘; @NgModule({ declarations:[ ScrollDirective, ScrollBindDirective ], exports:[ ScrollDirective, ScrollBindDirective ], providers:[ScrollService] }) export class ZTWScrollModule{}
在app.module中imports它。
scroll.service.ts:
import {Injectable} from ‘@angular/core‘; import {Subject} from ‘rxjs/Subject‘; @Injectable() export class ScrollService{ scrollTop:Subject<number>=new Subject(); constructor(){}; controlNodes=[]; //储存所有的scrollControl name:string=‘bb‘; getAbsoluteTop(node){ //获得scrollControl的绝对高度。 let top=node.offsetTop; if(node.offsetParent) top+=this.getAbsoluteTop(node.offsetParent); return top; } }
scroll.directive.ts:
监听body的滚动行为。
import {Directive} from ‘@angular/core‘; import {ScrollService} from ‘./scroll.service‘; @Directive({ selector:‘[ztwScrollBind]‘ }) export class ScrollDirective{ constructor( private scrollService:ScrollService ){ window.onscroll=function(){ let topNum=document.querySelector(‘body‘).scrollTop; let nodes=scrollService.controlNodes; if(nodes===[])return; nodes.forEach(node=>{ //动态重写每个scrollControl的绝对高度。因为每个scrollControl的绝对高度不一定是固定的。 let top=scrollService.getAbsoluteTop(node); node.ztw_top=top; node.ztw_bottom=top+node.offsetHeight; }) scrollService.scrollTop.next(topNum); } } }
scrollBind.directive.ts:
控制每个scrollControl。
import {Directive,Input,Output,EventEmitter,ElementRef} from ‘@angular/core‘; import {ScrollService} from ‘./scroll.service‘; @Directive({ selector:‘[ztwScrollControl]‘ }) export class ScrollBindDirective{ @Input(‘ScrollBind‘)node:string; @Output() scrolled=new EventEmitter; @Output() leaved=new EventEmitter; constructor( private el:ElementRef, private scrollService:ScrollService ){ } ngAfterViewInit(){ let node=this.el.nativeElement; this.scrollService.controlNodes.push(node); let sendOnece=true,scrolled=false; let sendObj={target:node}; this.scrollService.scrollTop.subscribe(v=>{ //给scrollControl分配一个订阅。scroll进入时触发一次scrolled,离开时触发一次leaved。 if(!node.ztw_top) return; if(v>node.ztw_top&&v<node.ztw_bottom){ if(!sendOnece)return ; this.scrolled.emit(sendObj); sendOnece=false; scrolled=true; }else{ if(!scrolled) return; this.leaved.emit(sendObj); scrolled=false; sendOnece=true; } }) } }
插件分享:
已分享至github:https://github.com/zhantewei2/angular2-module-share
里面还有一个前段时间,纯JS写的文本编辑器。供大家分享及指教。
时间: 2024-10-12 11:09:36