首頁 web前端 js教程 使用AngularJS2與D3.js整合如何實現自訂視覺化

使用AngularJS2與D3.js整合如何實現自訂視覺化

Jun 22, 2018 pm 06:32 PM

本篇文章主要介紹了ANGULAR2 與 D3.js整合實作自訂視覺化的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

本文介紹了ANGULAR2 與D3.js整合實作自訂視覺化的方法,分享給大家,具體如下:

目標

  1. 展現層與邏輯層分離

  2. 資料與視覺化元件相分離

  3. 資料與視圖雙向綁定,即時更新

  4. 程式碼結構清晰,易於維護與修改

#基本原理

##angular2 的元件生命週期鉤子方法\父子元件互動機制\模板語法

源碼解析

#程式碼結構很簡單,其中除主頁index.html和main.ts之外的程式碼結構如下所示:

程式碼結構

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 &#39;@angular/core&#39;;
@Component({
 selector: &#39;app-root&#39;,
 templateUrl: &#39;./app.component.html&#39;,
 styleUrls: [&#39;./app.component.css&#39;]
})
export class AppComponent implements OnInit, OnDestroy {
 intervalId = 0;
 numArray = [];
 // 清除定时器
 private clearTimer() {
  console.log(&#39;stop refreshing&#39;);
  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子元素

  3. import { Component, Input, OnChanges, AfterViewInit, ViewChild} from &#39;@angular/core&#39;;
    import {BubblesChart} from &#39;./bubbles.chart&#39;;
    declare var d3;
    @Component({
      selector: &#39;bubbles&#39;,
      template: &#39;<svg #target width="900" height="300"></svg>&#39;,
    })
    export class Bubbles implements OnChanges, AfterViewInit {
      @Input() values: number[];
      chart: BubblesChart;
      @ViewChild(&#39;target&#39;) 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當中先引入

  3. 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(&#39;start rendering&#39;);
        console.log(values);
        d3.select(this.target)
          // Get the old circles
          .selectAll(&#39;circle&#39;)
          .data(values)
          .enter()
          // For each new data point, append a circle to the target SVG
          .append(&#39;circle&#39;)
          // Apply several style attributes to the circle
          .attr(&#39;r&#39;, d => Math.log(d)) // 半径
          .attr(&#39;fill&#39;, &#39;#5fc&#39;) // 颜色
          .attr(&#39;stroke&#39;, &#39;#333&#39;) // 轮廓颜色
          .attr(&#39;transform&#39;, (d, i) => { // 移动位置
            var offset = i * 30 + 3 * Math.log(d);
            return `translate(${offset}, ${offset})`;
          });
      }
    
      destroy() {
        d3.select(this.target).selectAll(&#39;circle&#39;).remove();
      }
    }
    效果顯示

    上面是我整理給大家的,希望今後對大家有幫助。

    相關文章:

    在axios中如何實作cookie跨域

    在webpack中有關於jquery外掛程式的環境配置(詳細教程)

    在Bootstrap4 Vue2中如何實作分頁查詢

    以上是使用AngularJS2與D3.js整合如何實現自訂視覺化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP教程
1585
276
掌握JavaScript並發模式:網絡工人與Java線程 掌握JavaScript並發模式:網絡工人與Java線程 Jul 25, 2025 am 04:31 AM

JavaScript的WebWorkers和JavaThreads在並發處理上有本質區別。 1.JavaScript採用單線程模型,WebWorkers是瀏覽器提供的獨立線程,適合執行不阻塞UI的耗時任務,但不能操作DOM;2.Java從語言層面支持真正的多線程,通過Thread類創建,適用於復雜並發邏輯和服務器端處理;3.WebWorkers使用postMessage()與主線程通信,安全隔離性強;Java線程可共享內存,需注意同步問題;4.WebWorkers更適合前端並行計算,如圖像處理,而

VUE 3組成API與選項API:詳細比較 VUE 3組成API與選項API:詳細比較 Jul 25, 2025 am 03:46 AM

Vue3中CompositionAPI更适合复杂逻辑和类型推导,OptionsAPI适合简单场景和初学者;1.OptionsAPI按data、methods等选项组织代码,结构清晰但复杂组件易碎片化;2.CompositionAPI用setup集中相关逻辑,利于维护和复用;3.CompositionAPI通过composable函数实现无冲突、可参数化的逻辑复用,优于mixin;4.CompositionAPI对TypeScript支持更好,类型推导更精准;5.两者性能和打包体积无显著差异;6.

如何在JS中創建和附加元素? 如何在JS中創建和附加元素? Jul 25, 2025 am 03:56 AM

使用document.createElement()創建新元素;2.通過textContent、classList、setAttribute等方法自定義元素;3.使用appendChild()或更靈活的append()方法將元素添加到DOM中;4.可選地使用insertBefore()、before()等方法控制插入位置;完整流程為創建→自定義→添加,即可動態更新頁面內容。

微觀前端體系結構:實施指南 微觀前端體系結構:實施指南 Aug 02, 2025 am 08:01 AM

Microfrontendssolvescalingchallengesinlargeteamsbyenablingindependentdevelopmentanddeployment.1)Chooseanintegrationstrategy:useModuleFederationinWebpack5forruntimeloadingandtrueindependence,build-timeintegrationforsimplesetups,oriframes/webcomponents

在打字稿中的高級條件類型 在打字稿中的高級條件類型 Aug 04, 2025 am 06:32 AM

TypeScript的高級條件類型通過TextendsU?X:Y語法實現類型間的邏輯判斷,其核心能力體現在分佈式條件類型、infer類型推斷和復雜類型工具的構建。 1.條件類型在裸類型參數上具有分佈性,能自動對聯合類型拆分處理,如ToArray得到string[]|number[]。 2.利用分佈性可構建過濾與提取工具:Exclude通過TextendsU?never:T排除類型,Extract通過TextendsU?T:never提取共性,NonNullable過濾null/undefined。 3

Jul 26, 2025 am 07:52 AM

要獲取JavaScript數組的長度,可以使用內置的length屬性。 1.使用.length屬性可返回數組中元素的數量,例如constfruits=['apple','banana','orange'];console.log(fruits.length);//輸出:3;2.該屬性適用於包含字符串、數字、對像或數組等任何類型數據的數組;3.length屬性會自動更新,當添加或刪除元素時其值隨之變化;4.它返回基於零的計數,空數組的length為0;5.可手動修改length屬性來截斷或擴展數組,

JavaScript中的VAR,LET和CONST之間有什麼區別? JavaScript中的VAR,LET和CONST之間有什麼區別? Aug 02, 2025 pm 01:30 PM

varisfunction-scoped,canbereassigned,hoistedwithundefined,andattachedtotheglobalwindowobject;2.letandconstareblock-scoped,withletallowingreassignmentandconstnotallowingit,thoughconstobjectscanhavemutableproperties;3.letandconstarehoistedbutnotinitial

了解JavaScript的代理並反映API 了解JavaScript的代理並反映API Jul 26, 2025 am 07:55 AM

Proxy和ReflectAPI是JavaScript中用於攔截和自定義對像操作的強大工具;1.Proxy通過包裝目標對象並定義“陷阱”來攔截如get、set等操作,實現如日誌、驗證、只讀控制等功能;2.Reflect提供與Proxy陷阱對應的方法,確保默認行為的一致性和正確性,提升代碼可維護性;3.實際應用包括Vue3響應式系統、數據驗證、調試日誌、不可變對象和API模擬;4.使用時需注意性能開銷、內置對象的複雜行為、this綁定問題及嵌套對象需遞歸代理;5.合理使用可構建高效、可調試、反應式

See all articles