Angular Elements 组件在非angular 页面中使用的DEMO

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、Angular Elements 介绍

      Angular Elements 是伴随Angular6.0一起推出的新技术。它借助Chrome浏览器的ShadowDom  API,实现一种自定义组件。 这种组件可以用Angular普通组件的开发技术进行编写,学习成本低,当它构建好后生成一个打包的js文件。如果页面引入该Js文件 ,就相当于在页面中新增了一个标签,所以在任意框架中都可以使用新标签,就像它是原生div一样。

       ShadowDom  API  是谷歌自己一直强推的API,也一直未标准化的技术。2013年推出的chrome25中,就支持Shadow Dom v0的API,至今都没有其它浏览器附和谷歌的。2016年的chrome53时,谷歌又推出了Shadow Dom v1的API。v1版本似乎将成正式标准,就连Edge都是都示正在考虑。无论v0,v1版本,现在都是草案的状态,距离正式标准还很远。幸运的是,现在有个项目@webcomponents/custom-elements提供polyfill技术方案,能让其它浏览器提前用上该技术。

二、Angular Elements 使用实战

     前不久看到项目angular-elements-dashboard :支持动态加载模块和动态加载外部的模块。其中加载动态外部模块就是先编译一个angular elements项目,然后动态把该bundle.js插入到页面中。于是我就尝试一下,看这个构建的angular elements 文件到底如果引入一个空白的页面中,引入后的组件在浏览器中又是如何呈现的。

    Demo 源文件 在 码云:https://gitee.com/40288193/Angualr-elements-demo  

     页面结构:     

f14fdab542f8403b5d8d32278fb247b4c59.jpg

demo.html                                                                                            主文件是一个标准的html5页面

external-dashboard-tile.emulated.js 

external-dashboard-tile.native.js 

 是angular elements 用两种组件封装的方式打包的结果,分别是ViewEncapsulation.Emulated和                 ViewEncapsulation.Native封装。它们也是今天的测试主要对象。
custom-elements.min.js @webcomponents/custom-elements 的文件,是Shadow Dom v1 的polyfill文件 。 
如果用chrome53以后的浏览器的话,可以不引入它。如果是其它浏览器,它是必须的。
native-shim.js 如果angular elements项目打包时,tsconfig.json中,
编译参数 target: "es5"时,  所有的class都被编译为function,此时就必须引入该文件。
编译参数 target:"es2015"或更高级的模块时,则不需要引入它。
根本原因是,Shadow Dom v1的api 只支持自定义元素是一个class类型,不能是一个function。
zone.js    angular依赖的文件

 

页面代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Angular Elements 演示Demo</title><link rel="stylesheet" href="./bootstrap.min.css">
</head>
<body class="container"><h1>Angular Elements 演示Demo</h1><div class="row"><h3>原生JS插入一个自定义元素</h3><div id="byJs"></div></div><div class="row"><h3>用jqyery插入一个自定义元素</h3><div id="byJquery"></div></div><script src="./zone.js"></script><script src="./custom-elements.min.js"></script><script src="./native-shim.js"></script><script src="./jquery.min.js"></script><script src="./external-dashboard-tile.native.js"></script><script>// 新引入的external-dashboard-tile元素,  它有三个属性a,b,c,它展示为一个表格// 原生JS插入const dom = document.createElement("external-dashboard-tile"), byJs = document.getElementById("byJs");dom.classList.add("col-sm-2");dom.setAttribute('a', '' + Math.round(Math.random() * 100));dom.setAttribute('b', '' + Math.round(Math.random() * 100));dom.setAttribute('c', '' + Math.round(Math.random() * 100));byJs.appendChild(dom);// Jquery 插入const $dom = $("<external-dashboard-tile>"), $byJquery = $("#byJquery");$dom.addClass("col-sm-2");$dom.attr("a", Math.round(Math.random() * 100));$dom.attr("b", Math.round(Math.random() * 100));$dom.attr("c", Math.round(Math.random() * 100));$byJquery.append($dom);// 定时去修改两个表格的某个列setInterval(function () {dom.setAttribute('b', '' + Math.round(Math.random() * 100));$dom.attr("a", Math.round(Math.random() * 100));}, 2000)</script>
</body></html>

效果:

  注意:上下两个组件中,a,b两个列是定时变化的。

三、Angular Elements应用页面的分析

        代码逻辑估计小学生也看的懂了,分别用原生JS 和 jquery 两种技术,生成<external-dashboard-tile>元素,并且设置元素的class 和 属性,最后插入到页面上。   最后写个定时器,分别用两种技术定时修改它们的一个属性

       当我引入external-dashboard-tile.emulated.js  文件时,它是angular模拟组件的方式插入页面的,就是自定义标签里直接嵌入了div,这种模式并不是真正的Shadow Dom ,它只是一种模拟手段,它通过引入_ng_content-c0的属性空间隔离css 样式。

当我引入external-dashboard-tile.native.js  文件时,就是用原生的方式引入了,看效果,页面上有了 #showdow-root节点,并且外部的bootstrap样式传递不进去了,造成组件的样式全无。

     总结一下,通过使用两个种方式操作自定义元素和以前学习的内置元素的概念一模一样。  那么就是说一个angular elements技术打包好的组件可以: build once ,run any framework!  这个黑科技还是让人惊喜的。  

     Angular Elements的开发技术和Angular普通组件是一致的,像Input属性,Output事件,  依赖注入的支持, 内容投影的支持(这个好像要用<slot> 来做)  ,总之并没有因为 Angular Elements需要脱离ng环境,没有Module 没有Route等支持,它就阉割功能,添加限制。没有,全部没有, 这一点谷歌还是良心。

四、Angular Elements应用后记

       组件封装方式分别是native,emulated 。按照以前看的文章说明,Native模式其实用的是Shadow Dom v0,并不是最新的技术,在2018.7.25号的6.1.0升级中,它又引入了新的封装方式ViewEncapsulation.Shadow 。它的目的是为了不改变Native的模式情况下,引入最新的Shadow Dom v1技术 ,而Native已经过时,不鼓励使用。详见  (#24718) 

      现在这种打包模式,对于一个最简单的组件,打包后体积是189kb,是非常之大的。据说伴随angular 7推出的ivy 渲染引擎能大大减小组件的构建体积,忘在哪个视频中看到说打包后可到10kb的量级,但现在找不到该说法的来源。现在angular的commit中,有一半都是关于ivy的提交,只需要大家静等angular 7.0的到来了! 

       现在相关资料还比较少,我也是看youtube视频学习的相关介绍,下面给大家几个学习资料

官方文档:https://www.angular.cn/guide/elements

视频 Elements in v6 and Beyond :https://www.youtube.com/watch?v=Z1gLFPLVJjY

示例项目angular-elements-dashboard:https://github.com/manfredsteyer/angular-elements-dashboard

转载于:https://my.oschina.net/u/1540190/blog/1929672

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转) android里,addContentView()动态增加view控件,并实现控件的顶部,中间,底部布局...

http://blog.csdn.net/bfboys/article/details/52563089转载于:https://www.cnblogs.com/zhangminghan/p/6182909.html

verilog仿真——$test$plusargs 和 $value$plusargs

VERILOG的参数可以用define和parameter的方式定义&#xff0c;这种方法要求我们在编译前将变量必须定义好&#xff0c;编译完成之后再也不能修改&#xff1b; 然而&#xff0c;有时候我们在进行仿真时&#xff0c;需要从外部传递参数&#xff0c;这个要求怎么满足呢&#xff1…

卢卡斯定理

卢卡斯定理:解决一类组合数取模问题 A、B是非负整数&#xff0c;p是质数。AB写成p进制&#xff1a;Aa[n]a[n-1]...a[0]&#xff0c;Bb[n]b[n-1]...b[0]。 则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) modp同余 即&#xff1a;Lucas(n,m,p)c(n%p,m%p)*Luc…

内核理解

在纯技术方面&#xff0c;内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件&#xff0c;并充当底层的驱动程序&#xff0c;对系统中的各种设备和组件。内核启动init程序作为第一个进程&#xff0c;该进程负责进一步的系统初始化操作&#xff0c;并显示登…

loadrunner中对https证书的配置

1、准备好网站的证书&#xff0c;一般证书是cer格式&#xff1b; 2、因为loadrunner只支持pem格式的证书&#xff0c;所以要将证书转换格式&#xff0c;利用openssl工具&#xff1b;&#xff08;或者直接让开发提供pem格式的证书&#xff09;3、得到pem格式的证书之后&#xff…

Android 9 Pie震撼来袭 同步登陆WeTest

作者&#xff1a;We Test小编商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。原文链接&#xff1a;wetest.qq.com/lab/view/40…WeTest 导读2018年8月7日&#xff0c;Google对外发布最新 Android 9.0 正式版系统&#xff0c;并宣布系统版本Android P 被正…

Datapath综合代码规范(Verilog)

一、一般准则 1、有符号数运算 利用类型“signed”完成有符号数运算&#xff0c;而不是用无符号数模拟有符号数运算。这样可以得到更好的QoR。在资源报告中检查操作数的类型和大小。 2、符号/零扩展 尽量不要手动扩展。verilog利用signed/unsigned会自动完成扩展。这样代码可…

Linux下V4L2编程小结

http://www.360doc.com/content/12/0318/16/532901_195392228.shtml :davind dm365linux移植 http://www.embedhq.org/html/jsbw/2010/0425/390.html :Linux下V4L2编程小结

百(垃)度(圾)之星初赛B hdu6114

Chess 题意&#xff1a;中文题 思路&#xff1a;其实就是在n个格子上放m个棋子&#xff08;n>m&#xff09;&#xff08;xjb套Lucas的板子... AC代码&#xff1a; #include "iostream" #include "string.h" #include "stack" #include "…

variable 'xxx' unsafe in 'case'的处理

问题描述&#xff1a; case get(?Player_LoopTaskInfo) of{TargetCnt, TaskStar, TaskExp} ->ok;_ ->throw("not_found_loop_task_info") end 在case语句中&#xff0c;这样写&#xff0c;编译时&#xff0c;会提示变量unsafe&#xff0c;解决编译器报错的…

SDUT 3347 数据结构实验之数组三:快速转置

数据结构实验之数组三&#xff1a;快速转置 Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description 转置运算是一种最简单的矩阵运算&#xff0c;对于一个m*n的矩阵M( 1 < m < 10000,1 < n < 10000 )&#xff0c;它的转置矩阵T是一个n*m的矩阵&…

linux设备和驱动加载的先后顺序

Linux驱动先注册总线&#xff0c;总线上可以先挂device&#xff0c;也可以先挂driver&#xff0c;那么究竟怎么控制先后的顺序呢。 Linux系统使用两种方式去加载系统中的模块&#xff1a;动态和静态。 静态加载&#xff1a;将所有模块的程序编译到Linux内核中&#xff0c;由do_…

CMOS 图像传感器——Skipping 和 Binning 模式

在通常的CMOS读取方式中&#xff0c;由于像素读取规模的差异&#xff0c;不同的分辨率对应不同的帧率。在通道带宽固定的前提下&#xff0c;想要提高帧率就要考虑是否需要缩小视野&#xff08;外圈裁切&#xff09;。若不希望视野缩小&#xff0c;需要减少采样的分辨率。 常用的…

DAVINCI DM365-368中 linux-2.6.32的移植

http://www.360doc.com/content/12/0318/16/532901_195392228.shtml 很详细的一篇文章&#xff0c;在此感谢了&#xff01; http://www.rosoo.net/a/201001/8316.html DM系列芯片外设详细介绍

Jacoco--测试覆盖率工具

介绍JaCoCo&#xff08;Java Code Coverage&#xff09;是一种分析单元测试覆盖率的工具&#xff0c;使用它运行单元测试后&#xff0c;可以给出代码中哪些部分被单元测试测到&#xff0c;哪些部分没有没测到&#xff0c;并且给出整个项目的单元测试覆盖情况百分比&#xff0c;…

HTML 标记大全参考手册

1.文件结构 文件类型 <HTML></HTML> &#xff08;放在文档的开头与结尾&#xff09; 文件主题 <TITLE></TITLE> &#xff08;必须放在「文头」区块内&#xff09; 文头 <HEAD></HEAD> &#xff08;描述性资料&#xff0c;如「主题」&#…

APB协议学习

APB(Advanced Peripheral Bus) 1、APB的概述与特点 APB主要用于低带宽的周边外设之间的连接&#xff0c;例如UART、1284等&#xff0c;它的总线架构不像AHB支持多个主模块&#xff0c;在APB里面唯一的主模块就是APB 桥。其特性包括&#xff1a;两个时钟周期传输&#xff1b;无…

私有协议栈开发

通信协议从广义上区分&#xff0c;可以分为公有协议和私有协议。由于私有协议的灵活性&#xff0c;它往往会在某个公司或者组织内部使用&#xff0c;按需定制&#xff0c;也因为如此&#xff0c;升级起来会非常方便&#xff0c;灵活性好。绝大多数的私有协议传输层都基于TCP/IP…

制作NFS

最近学习NFS&#xff0c;用本地测试. 以下是我的测试过程 环境 ubuntu 10.4 vm 7.1 终端 ifconfig 得到 ubuntu资料 INET ADDR 192.168.0.4 BCAST 192.168.0.255 MASK 255.255.255.0 一 安装NFS $ sudo apt-get install nfs-kernel-server $ sudo apt-get install nfs…

【笔记篇】C#笔记2

返回目录&#xff1a;目录请戳这里~ C#数组 基本概念不提。。int[] a; bool[] b new bool[10]; float[] c {0.5, 57.0, 233.3, 12345.67 }; double[] d new double[/*3*/]{233.33, 1926.0817, 4396.0 }; 然后数组和指针有很大的不同。。。 Array类不会用…… 有多维数组和…