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: ...
随机推荐
- scrapy 去重 dont_filter=False
yield Request(...... dont_filter=False)
- 简单了解一下php的迭代生成器yield
yield是从PHP5.5开始有的,关于yidle的说明鸟哥的博客做了详细说明,我觉得是有点复杂,在看了几篇其他的帖子还有案例,我大概知道yield的作用就是在做大量数据循环处理的时候,能节省很大一部 ...
- 教你用Visual Studio Code做PHP开发 - 微软官方工具,IDE中的黑马
转载于:http://bbs.wfun.com/thread-902655-1-1.html,仅供自己备忘 本文为我在智机网的原创 ] 关于Visual Studio Code,可能有的开发者很陌生 ...
- IO流-基础
//创建输出流对象 FileWriter fw = new FileWriter("d:\\a.txt"); /* * 创建输出流对象做了哪些事情: * A:调用系统资源创建了一个 ...
- Vue父子组件生命周期
转载自:https://blog.csdn.net/a8725585/article/details/79092505 vue父子组件钩子函数触发顺序 beforeMount后mounted前构造子组 ...
- topcoder srm 715 div1 -23
1.一个计算器,它执行的是一个只包含‘+’,‘-’的字符串$s$.初始化值为0,每遇到一个‘+’增加1,否则减少1.并保存运算过程的最大最小值$Max,Min$,最后的答案是$Max-Min$.比如$ ...
- Python3 tkinter基础 event keysym 查看按键的按键名
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- What is event bubbling and capturing?
What is event bubbling and capturing? 答案1 Event bubbling and capturing are two ways of event propaga ...
- cumtoj 一起来选课
一起来选课 题目地址:http://192.168.173.163/JudgeOnline/problem.php?cid=1019&pid=7 题目 明泽私立大学有n门课程提供给大一的同学来 ...
- JAVA JDBC 增删改查简单例子
1.数据库配置文件jdbc.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test username= ...