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写的文本编辑器。供大家分享及指教。

时间: 2024-10-12 11:09:36

angular2-scroll-module的相关文章

Angular2版本更新

2.0.0-beta.0 somnambulant-inauguration (2015-12-15) Enjoy! 2.0.0-alpha.55 (2015-12-15) Bug Fixes router: export ROUTER_LINK_DSL_PROVIDER and hide MockPopStateEvent (fc75220) Features core: enable dev mode by default (3dca9d5) BREAKING CHANGES Before

关于angular跳转路由之后不能自动回到顶部的解决方法

Question: angular2 scroll top on router change 当我们在第一个路由滑动到底部当我们点击导航跳转到另一个路由时页面没有回到顶部而是保持上一个路由的滚动位置,基本的解决办法有两种. 第一种解决方法是在组建的ngOnIinit()中进行调换路由后的重置 import { Component, OnInit } from '@angular/core'; import { Router, NavigationEnd } from '@angular/rout

angular2 ng build --prod 报错:Module not found: Error: Can&#39;t resolve &#39;./$$_gendir/app/app.module.ngfactory&#39;

调试页面 ng serve 正常 ng build 也正常 ng build --prod 异常:Module not found: Error: Can't resolve './$$_gendir/app/app.module.ngfactory' 开始以为是以前那样,引用错了路径或少引用了东西. 搜了好多资料,发现是 angular-cli 的版本有点低了(因为用了最新的material) 找到原因了,问题就很容易解决了 第一步: rm -rf node_modules/ 第二部: npm

[Step-By-Step Angular2](1)Hello World与自动化环境搭建

随着rc(release candidate,候选版本)版本的推出,万众瞩目的angular2终于离正式发布不远啦!五月初举办的ng-conf大会已经过去了整整一个月,大多数api都如愿保持在了相对稳定的状态——当然也有router这样的例外,在rc阶段还在大面积返工,让人颇为不解——不过总得说来,现在学习angular2不失为一个恰当的时机. Google为angular2准备了完善的文档和教程,按理说,官网(https://angular.io)自然是学习新框架的最好教材.略显遗憾的是,在B

从Angular2路由引发的前后端路由浅谈

笔者的学习进度比较慢,直到两年以前写的网站都还是以服务端为主导的,即网站的所有视图都由服务器视图模板来渲染,笔者使用的是 DotNet MVC,开发套路就是在Controller里面写Action,在Views里写对应的Action.cshtml,使用ajax发起请求已经是比较前端的事情了.这种时候由于DotNet MVC框架继承的微软风格的懒人模式,甚至不需要去知道其路由是如何实现的,给人一种感觉是只要在浏览器里敲进去Controller名与Action名,就访问到视图了. 后来笔者开始使用n

Angular2 - Starter - Pipes, Custom Pipes

在Angular2 模板中,我们在显示数据时,可以使用通道将数据转换成相应的格式的值的形式来显示,而且这不改变源数据.比如,我们可以使用date通道来转换时间显示的格式: {{date | date:'yyyy-MM-dd'}} ,(1) 以下是Angular提供的基本的通道. Basic Pipes Pipe Name Usage Parameters or Effection currency {{test.currency | currency }} 1234569678 > USD1,2

Angular2 Hello World 之 2.0

最近angular2正式版发布了,现在就趁热接着记录一下2.0版的Hello World.据说由RC6升级到2.0代码改动不是很大,在写的时候也感觉改动不是很大,这次记录还是以asp.net core 空项目模板为基础,本着在此基础上添加最少的代码来实现Hello World,没用的代码全部清掉(用的时候再引入). 一.准备工作. 首先,创建一个asp.net core空项目,并在Startup.cs类中添加“静态文件支持”:然后,在项目根目录下添加NPM配置文件.Gulp配置文件和typesc

发布自己的Angular2库初探

从去年年底开始使用ng2,遇到并解决或被虐了一些问题点,对其各种新特性与开发模式感觉还算舒服.还有的一个感想就是,要使用ng2还得先学习不少其他东西,比如TypeScript语法,比如ES6新特性,还有就是酷炫的npm平台.本文就将侧重点放到npm上来,看看npm平台给ng2带来的酷炫的帮助. 现在眼前有一个问题: 我写了一个自己很满意的ng2的通用小组件,现在想要在以后的其他项目中都使用它,甚至想要把它分享给互联网上其他同时在被代码虐的兄弟们一起使用,这要如何实现呢? 回想以前外链script

关于cannot find module &#39;xxxx’的一个可能解决方法。

关于cannot find module 'xxxx'的一个可能解决方法. 由于学习angular2,想单独学习一下typescript下angular2使用的'rxjs'是怎么使用的,我用npm自己安装了rxjs,并使用了如下语句 import { Observable } from 'rxjs'; 报错如下: cannot find module 'rxjs', 但是同样的语句在angular/cli生成的angular项目下是不报错的,我找了半天,各种解决方法都不适用于我遇到的情况.由于这

angular2最详细的开发环境搭建过程

本文所需要的源代码,从 http://files.cnblogs.com/files/lingzhihua/angular2-quickstart.rar 下载 angular官方推荐使用quickstart搭建angular2开发环境 git:http://git-scm.com/download下安装git node:https://nodejs.org/en/download/ npm:npm是nodejs官方未nodejs定制的一个工具,是Node.js的包管理器,是Node Packa