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 相关文章推荐
7个Javascript地图脚本整理
Oct 20 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
javascript中的数字与字符串相加实例分析
Aug 14 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
jquery实现简单易懂的图片展示小例子
Nov 21 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
Vue实现动态创建和删除数据的方法
Mar 17 Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 Javascript
基于Vue 实现一个中规中矩loading组件
Apr 03 Javascript
javascript异常处理实现原理详解
Feb 17 Javascript
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
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
如何开始收听短波广播
2021/03/01 无线电
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
php网页病毒清除类
2014/12/08 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
php实现的农历算法实例
2015/08/11 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
ext 代码生成器
2009/08/07 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
python正则表达式re模块详细介绍
2014/05/29 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
android面试问题与答案
2016/12/27 面试题
智乐游戏测试笔试题
2014/05/21 面试题
大四本科生的自我评价
2013/12/30 职场文书
仓库管理计划书
2014/05/04 职场文书
旷工辞退通知书
2015/04/17 职场文书
行政处罚听证告知书
2015/07/01 职场文书
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript