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 相关文章推荐
表单的焦点顺序tabindex和对应enter键提交
Jan 04 Javascript
浅析tr的隐藏和显示问题
Mar 05 Javascript
jQuery实现不断闪烁文字的方法
May 15 Javascript
js判断所有表单项不为空则提交表单的实现方法
Sep 09 Javascript
BootStrap 模态框实现刷新网页并关闭功能
Jan 04 Javascript
bootstrap table分页模板和获取表中的ID方法
Jan 10 Javascript
jQuery用noConflict代替$的实现方法
Apr 12 jQuery
zTree jQuery 树插件的使用(实例讲解)
Sep 25 jQuery
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
JavaScript执行环境及作用域链实例分析
Aug 01 Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
详解jenkins自动化部署vue
May 14 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
JAVA/JSP学习系列之六
2006/10/09 PHP
php获取淘宝分类id示例
2014/01/16 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
强制设为首页代码
2006/06/19 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
python实现目录树生成示例
2014/03/28 Python
python中pass语句用法实例分析
2015/04/30 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
QML使用Python的函数过程解析
2019/09/26 Python
如何一键升级Python所有包
2020/11/05 Python
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
同学聚会老师邀请函
2014/01/28 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
写给父母的感谢信
2015/01/22 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
java版 简单三子棋游戏
2022/05/04 Java/Android
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL