angular2-scroll-module

這篇介紹一下,寫一個本身的angular2滾動監聽插件javascript

目錄結構:java

  /scrollModule:node

    ztw-scroll.module.ts;git

    scrollBind.directive.ts;github

    scroll.directive.ts;angular2

    scroll.service.ts;app

使用:編輯器

({
  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:ide

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它。this

 

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寫的文本編輯器。供你們分享及指教。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息