• angular2-scroll-module


    这篇介绍一下,写一个自己的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写的文本编辑器。供大家分享及指教。

  • 相关阅读:
    对比度受限的自适应直方图均衡化(CLAHE)
    双边滤波
    快速高斯滤波
    积分图像的应用(二):非局部均值去噪(NL-means)
    非局部均值去噪(NL-means)
    积分图像的应用(一):局部标准差 分类: 图像处理 Matlab 2015-06-06 13:31 137人阅读 评论(0) 收藏
    积分图像 分类: 图像处理 Matlab 2015-06-06 10:30 149人阅读 评论(0) 收藏
    双边滤波与引导滤波 分类: 图像处理 2015-04-29 14:52 48人阅读 评论(0) 收藏
    UE4射击小游戏原型
    UnrealEngine4 尝鲜
  • 原文地址:https://www.cnblogs.com/ztwBlog/p/6368202.html
Copyright © 2020-2023  润新知