AngularJS2 与 D3.js集成实现自定义可视化的方法


Posted in Javascript onDecember 01, 2017

本文介绍了ANGULAR2 与 D3.js集成实现自定义可视化的方法,分享给大家,具体如下:

目标

  1. 展现层与逻辑层分离
  2. 数据与可视化组件相分离
  3. 数据与视图双向绑定,实时更新
  4. 代码结构清晰,易于维护与修改

基本原理

angular2 的组件生命周期钩子方法\父子组件交互机制\模板语法

源码解析

代码结构很简单,其中除主页index.html和main.ts之外的代码结构如下所示:

AngularJS2 与 D3.js集成实现自定义可视化的方法

代码结构

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
//components
import { AppComponent } from './app.component';
import { Bubbles } from './bubbles.component';

@NgModule({
 declarations: [
  AppComponent,
  Bubbles
 ],
 imports: [
  BrowserModule,
  FormsModule
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }

app.component.html

实现宿主视图定义,

2个按钮,按钮可以绑定了2点点击事件,执行相应的动作,刷新数组,同时完成汽泡图的更新;

1个汽泡图子组件,其中values为子组件的输入属性,实现父子组件之间的通信,numArray为汽泡图的输入数据数组,后续为随机生成的数组

<h1>
 <button (click)="refreshArr()" >开始刷新气泡图</button>
 <button (click)="stopRefresh()" >停止刷新气泡图</button>
 <bubbles [values]="numArray"></bubbles>
</h1>

app.component.ts

通过指定一个3秒刷新一次的定时器,刷新数据,这里需要注意,需要先清空数组,再添加元素,直接修改数组元素值而不改变引用,则无法刷新汽泡图

import { Component, OnDestroy, OnInit } from '@angular/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit, OnDestroy {
 intervalId = 0;
 numArray = [];
 // 清除定时器
 private clearTimer() {
  console.log('stop refreshing');
  clearInterval(this.intervalId);
 }
 // 生成指定范围内的随机数
 private getRandom(begin, end) {
  return Math.floor(Math.random() * (end - begin));
 }
 ngOnInit() {
  for (let i in this.numArray) {
   this.numArray[i] = this.getRandom(0, 100000000); // "0", "1", "2",
  };
 }
 // 元素关闭清除定时器
 ngOnDestroy() { this.clearTimer(); }
 // 启动定时刷新数组
 refreshArr() {
  this.clearTimer()
  this.intervalId = window.setInterval(() => {
   this.numArray = [];
   for (let i=0;i<8;i++)
   {
    this.numArray.push(this.getRandom(0, 100000000));
   }
  }, 3000);
 }
 // 停止定时刷新数组
 stopRefresh() {
  this.clearTimer();
 }
}

bubbles.component.ts 汽泡图组件类

  1. ngOnChanges() 生命周期方法,可以在输入属性values发生变化时,自动被调用;
  2. @ViewChild 可以获取对子元素svg的引用,其中#target自定义变量用于标识svg子元素
import { Component, Input, OnChanges, AfterViewInit, ViewChild} from '@angular/core';
import {BubblesChart} from './bubbles.chart';
declare var d3;
@Component({
  selector: 'bubbles',
  template: '<svg #target width="900" height="300"></svg>',
})
export class Bubbles implements OnChanges, AfterViewInit {
  @Input() values: number[];
  chart: BubblesChart;
  @ViewChild('target') target;//获得子组件的引用
  constructor() {
  }
  // 每当元素对象上绑定的数据 输入属性值 values 发生变化时,执行下列函数,实现图表动态变化
  ngOnChanges(changes) {
    if (this.chart) {
      // 先清空汽泡图,再重新调用汽泡图对象的render方法,根据变动后的值绘制图形
      this.chart.destroy();
      this.chart.render(changes.values.currentValue);
    }
  }
  
   ngAfterViewInit() {
      // 初始化汽泡图
      this.chart = new BubblesChart(this.target.nativeElement);
      this.chart.render(this.values);
    }
}

bubbles.chart.ts 汽泡图类

  1. d3.js 语法定义的汽泡图类,自带一个绘制方法和擦除方法
  2. 需要在index.html当中先引入 <script src="//d3js.org/d3.v2.js"></script>
declare var d3;
// define a bubble chart class 
// Exports the visualization module
export class BubblesChart {
  target: HTMLElement;
  //构造函数, 基于一个 HTML元素对象内部来绘制
  constructor(target: HTMLElement) {
    this.target = target;
  }
  // 渲染 入参为数值 完成基于一个数组的 汽泡图的绘制
  render(values: number[]) {
    console.log('start rendering');
    console.log(values);
    d3.select(this.target)
      // Get the old circles
      .selectAll('circle')
      .data(values)
      .enter()
      // For each new data point, append a circle to the target SVG
      .append('circle')
      // Apply several style attributes to the circle
      .attr('r', d => Math.log(d)) // 半径
      .attr('fill', '#5fc') // 颜色
      .attr('stroke', '#333') // 轮廓颜色
      .attr('transform', (d, i) => { // 移动位置
        var offset = i * 30 + 3 * Math.log(d);
        return `translate(${offset}, ${offset})`;
      });
  }

  destroy() {
    d3.select(this.target).selectAll('circle').remove();
  }
}

效果展示

AngularJS2 与 D3.js集成实现自定义可视化的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
jQuery学习笔记之jQuery中的$
Jan 19 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
javascript实现校验文件上传控件实例
Apr 20 Javascript
jquery事件的ready()方法使用详解
Nov 11 Javascript
直接拿来用的页面跳转进度条JS实现
Jan 06 Javascript
基于Bootstrap实现图片轮播效果
May 22 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
Mar 26 Javascript
深入理解Angular4中的依赖注入
Jun 07 Javascript
微信小程序自定义select下拉选项框组件的实现代码
Aug 28 Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 Javascript
javascript的setTimeout()使用方法总结
Nov 20 Javascript
javascript Function函数理解与实战
Dec 01 #Javascript
React Native react-navigation 导航使用详解
Dec 01 #Javascript
分析JS单线程异步io回调的特性
Dec 01 #Javascript
JavaScript定义及输出螺旋矩阵的方法详解
Dec 01 #Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
Dec 01 #Javascript
利用babel将es6语法转es5的简单示例
Dec 01 #Javascript
微信小程序实现鼠标拖动效果示例
Dec 01 #Javascript
You might like
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
PHP导入导出Excel代码
2015/07/07 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
Python实现字典依据value排序
2016/02/24 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
django 外键model的互相读取方法
2018/12/15 Python
django实现用户注册实例讲解
2019/10/30 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
广州盈通面试题
2015/12/05 面试题
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
葬礼司仪主持词
2014/03/31 职场文书
升学宴主持词
2014/04/02 职场文书
公司承诺书格式
2014/05/21 职场文书
体育馆的标语
2014/06/24 职场文书
中国梦读书活动总结
2014/07/10 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
2019各种承诺书范文
2019/06/24 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
JavaScript异步操作中串行和并行
2021/11/20 Javascript
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python