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

最新文章

  1. Redis安装部署
  2. Go语言配置与开发环境配置
  3. Windows编程入门程序详解
  4. TestLink安装及整合Jira
  5. Where art thou
  6. js获取url中的参数,url中传递中文的时候通过js解码的方式
  7. 怎样在mysql里面修改数据库名称
  8. c++11 : Local and Unnamed Types as Template Arguments
  9. python基础学习05(核心编程第二版)部分
  10. 【转】monkey工具简介
  11. unix网络io模型
  12. redis C接口hiredis 简单函数使用介绍
  13. php数据库备份脚本
  14. [LeetCode] Design Search Autocomplete System 设计搜索自动补全系统
  15. docker环境部署
  16. win7用VMware安装CentOs7搭建Linux环境
  17. 软件调用QML的两种方式
  18. LeetCode--013--罗马数字转整数(java)
  19. VMware中让虚拟机支持虚拟化
  20. 基于Socket的Android手机视频实时传输

热门文章

  1. Exchange 2016 系统要求
  2. 创建view,保存GROUP_CONCAT数据
  3. Java 之单例设计模式
  4. java连接elastic search 9300
  5. django 配置 多数据库
  6. 【我的Android进阶之旅】Android Studio查看Logcat时,如果一行Log太长如何换行显示?
  7. 我的Android进阶之旅------>Android studio 如何修改工程的包名
  8. [Mysql ]TIME ZONE
  9. 安卓ios app自动化测试用例模板
  10. MiniUI级联