angular7 + d3 显示svg
汇总一些之前没有注意到的问题
总体思路:
app只是显示svg为主,接收后端推送的数据改变,显示变化后的svg。
因此,只用d3的数据绑定更新组件里<svg></svg>节点. 而不用 ng的数据绑定。
组件view 的svg部分由d3负责。 根据数据service接收到的"不可变数据”,让d3 判断绑定数据的改变,然后去更新view。
d3的用法类似react
selection.data() 类似react的虚拟dom。 enter() exit() 子集类似diff 处理的callback。
这样,可以把d3渲染功能封到1个service里。svg的操作部分在web组件里就没有了,在生命周期钩子里调用服务即可。
定制d3导入子模块,attrs:
一般用d3 都是:
import * as d3 from 'd3';
但是有2个问题:
1 d3现在特别大,这样import的绝大多数用不上,没必要
2 d3的子模块太多了,默认并没有把全部子模块都安装上,我很喜欢用的 .attrs()多个属性,就在d3-selection-multi里,默认安装d3是没有安装这个的。
想用这个,要手工安装
npm i d3-selection-multi
d3 官网https://github.com/d3/d3 只给出了node下的导入方式:
var d3 = Object.assign({}, require("d3-format"), require("d3-geo"), require("d3-geo-projection"));
在ts里要稍微变一下, 不得不每个命名1次,然后再Object.assign({}
import * as d3Selection from 'd3-selection';
import * as d3Attrs from 'd3-selection-multi';
import * as d3Geo from 'd3-geo';
export const d3 = Object.assign({}, d3Selection, d3Attrs, d3Geo);
然后后面就照用了。我用了export导出,可以给别的模块用。
ng使用d3.select()的渲染时机:
要在 ngAfterViewInit之后,不然view还没创建好 选不到任何元素。
svg的style
这个略坑。很多地方给出的解决方案是在组件元数据里设置:
encapsulation: ViewEncapsulation.None,
但这样的坏处是,d3.select('svg') 会找到全局全部svg,我恰好全局有多张svg,结果选中了多个组件里的svg。后面的数据绑定到每个svg上去了。(刚开始还怀疑是不是负责d3渲染的service是不是每个组件都要单独注入一个,后来一想这样太傻了,不可能。)
1 如果设置
ViewEncapsulation.None
那么,选中svg元素,就要设置一个id
::ng-deep
g#marsh path {
fill: rgb(21, 63, 13);
fill-opacity: 0.5;
stroke: rgb(21, 63, 13);
stroke-width: 3;
}
这样就OK了,个人认为这样最好。
——附注:ng7的 ViewEncapsulation 默认是 Emulated。
Member | Description |
---|---|
Emulated: 0 |
Emulate This is the default option. |
Native: 1 |
|
None: 2 |
Don't provide any template or style encapsulation. |
ShadowDom: 3 |
Use Shadow DOM to encapsulate styles. For the DOM this means using modern Shadow DOM and creating a ShadowRoot for Component's Host Element. |
默认效果用 ::ng-deep 就够了
Native在chrome 72上提示,马上要过期
None 说过了效果,各组件就串了,不推荐
ShadowDom 好像svg用不了。
angular7 + d3 显示svg的更多相关文章
- d3操作svg路径动画,及dom移动
图片跟随路径循环运动,dom也跟着路径运动(利用实时获取坐标位置的方法,改变transform) 1,准备路径 a,自己脑补路径 b,在ps上画好,然后在保存成png-24图片,背景透明,在网站htt ...
- 2019-9-2-本文说如何显示SVG
title author date CreateTime categories 本文说如何显示SVG lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17:23 ...
- D3——绘制SVG图形-直方图
1.创建SVG元素 var svg = d3.select("body").append("svg"); 2.为SVG元素设置属性 svg.attr() .at ...
- d3.js+svg的树形图
效果图 数据 { "name":"中国", "children": [ { "name":"浙江" ...
- 解决batik使用JScrollPane显示svg图滚动条不显示的问题
// 必须使用batik提供的JSVGScrollPane,使用swing自己的组件JScrollPane初始化时滚动条不会显示. JSVGScrollPane svgJScrollPane = ne ...
- D3之svg transform 与 css3 transform 区别与联系
D3就不用多介绍了,在数据可视化界属于大佬级别的js库.在这里主要想记录一下在写程序期间遇到的一个问题. 如下图所示,想完成主视图在小地图上的映射,小地图的白色矩形框用来代表当前主视图可见区域,主视图 ...
- 本地显示svg正常显示,在工程项目中无法正常显示
提前说明:此文仅记录个人项目问题,不具有众参考意义. 原因: 工程中对引用的资源进行解析设置,即resource设置. 解决方法: 找到静态资源加载路径,添加 if(urlpostfix.equals ...
- d3.js svg中 g 标签问题一览
svg 中的g标签, 算是比较特殊 1 没有x y属性 2 没有width height 属性 3 不能fill 4 .... g标签基本只管分组问题, 其他功能一概不提供 要解决这些问题, 直接在g ...
- window 系统显示svg、psd格式文件
可以安装SVG Explorer Extension来预览略缩图原地址:https://svgextension.codeplex.com 参考地址 github上 exe 文件下载地址 https: ...
随机推荐
- django 表单常用field
BooleanField字段:相当于单选框 CharField:接受字符串 参数:max_length最大长度,min_length最小长度 require字段是否是必须的,默认为required=T ...
- 叶亚明:合格CTO的六要素(转)
叶亚明,携程旅行网CTO & 高级技术副总裁,负责携程的移动.Online.呼叫中心等的技术架构.开发及运营.在加入携程之前,叶亚明是ebay.com技术平台总监,领导ebay.com几代网站 ...
- shell脚本一键安装redis集群
简介: 明天再写,上脚本 #!/bin/bash #-------------------------------------------------------------------------- ...
- 缩点:Power Plant;
题目传送门:[UVALive 6437]Power Plant 题目大意:T组数据,给定一幅带权图(n, m), 然后给定k个点, 与图中存在有若干条边.每个点都要至少要和这k个点的一个点直接或间接相 ...
- 【4opencv】CLR基本原理和如何运用于GOCW
GOCW的重点和难点就在于Csharp调用OpenCV,其中的桥梁就是CLR,当然我们也有其他方法,但是CLR是一个比较新的.比较可靠的.关键是能用的桥梁.这里关于CLR的基本原理知识.如何用于GOC ...
- bzoj 1014 火星人prefix - 链表 - 分块
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- bash 特性
命令hash: 缓存此前命令的查找结果:key-value key:搜索键 value:值
- 学习模型-视图-控制器MVC模式
1.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...
- ODAC(V9.5.15) 学习笔记(六)TOraSQL、TOraTable和TOraStoredProc
TOraSQL是一个SQL语句执行控件,包括PL/SQL块等,不返回数据集结果. 名称 类型 说明 ChangeCursor Boolean 在非阻塞模式下是否允许改变屏幕的光标 WaitExecut ...
- innerHTML和 innerText的区别
共同点:innerHTML和innerText都会把元素内内容替换掉.不同点:1,innerHTML: 也就是从对象的起始位置到终止位置的全部内容,包括Html标签. 上例中的test.innerHT ...