其实我经过这段时间的深刻学习,已经写到第6,7篇的,天天晚上都熬夜很晚,我发现了angular的宝贵东西,也慢慢明白了这个好东西,因为第一篇我的写的质量比较高,后面写的质量不高,感受有点初级,一直没发,本身也开始迷茫了,研究源码的目标是为了什么,啃源码是一个很迷茫很打击自信有挑战性的东西,须要要一堆迷迷糊糊的东西去理解本质,加上前面几个月没怎么深刻angular致使不少东西也忘记了,本身也是抱着一个初学者的态度去探究源码,已经编写的质量一直达不到本身的要求,可是我编写的一些东西,都是抱着初学者的态度去理解的,对于解决问题和从实际问题去理解angular仍是有很大帮助的css
技术成长分为三个阶段:html
第一阶段:化难为易node
第二阶段:由易变难api
第三阶段:分割难易app
本身的编写的时候是否是应该先作个第一阶段的事,理解怎么能全面的去,精通这个api,官网上面的介绍,说实例有点浅,本身能不能作到,遇到这个api基本能理解所有的方法,相信本身能编写20篇事后的质量可能有明显的提升,因此急不来,慢慢来,别过于抱着目的性去弄,有时候遇到太难的问题,容易致使心态崩溃,能够跟之前同样,从源码的基础上去啃透这个api,但愿将来的本身能变得更强,学东西仍是尽可能让本身变得更加自信...dom
<div data="[1,2,3]" #apps>121212</div> export class UserComponent implements OnInit ,AfterViewInit{ @ViewChild('apps') ages:ElementRef; constructor(private kvDiffers: KeyValueDiffers, private http: HttpClient,private renderer:Renderer2) {} ngAfterViewInit() { // 建立dom let app = this.renderer.createElement('div'); // 建立文本 let text = this.renderer.createText('大帅比'); // 建立注释 let com=this.renderer.createComment('我是注释') //添加建立的dom this.renderer.appendChild(this.ages.nativeElement,app) //添加建立的文字 this.renderer.appendChild(this.ages.nativeElement,text) this.renderer.appendChild(this.ages.nativeElement,com) } }
this.renderer.insertBefore(父节点,要添加的子节点newChild,现节点前面添加newChild,isMove:boolean 是否触发动画)
this.renderer.removeChild(父节点,删除的子节点,)
删除全部子节点svg
const childElements = this.el.nativeElement.children; for (let child of childElements) { this.renderer.removeChild(this.el.nativeElement, child); }
\packages\platform-browser\src\dom\dom_renderer.tsoop
export const NAMESPACE_URIS: {[ns: string]: string} = { 'svg': 'http://www.w3.org/2000/svg', 'xhtml': 'http://www.w3.org/1999/xhtml', 'xlink': 'http://www.w3.org/1999/xlink', 'xml': 'http://www.w3.org/XML/1998/namespace', 'xmlns': 'http://www.w3.org/2000/xmlns/', }; createElement(name: string, namespace?: string): any { if (namespace) { // 命名空间,我的以为没多大用处 return document.createElementNS(NAMESPACE_URIS[namespace] || namespace, name); } return document.createElement(name); } // 建立文本 createText(value: string): any { return document.createTextNode(value); } // 添加dom ,父节点 子节点 appendChild(parent: any, newChild: any): void { parent.appendChild(newChild); } // 插入节点, 父节点 新的子节点 现有的前面插入(新的子节点) insertBefore(parent: any, newChild: any, refChild: any): void { if (parent) { parent.insertBefore(newChild, refChild); } } // 父节点直接删除子节点 removeChild(parent: any, oldChild: any): void { if (parent) { parent.removeChild(oldChild); } }
// 卧槽居然原生里面能够创造出,注释 createComment(value: string): any { return document.createComment(value); }
//父节点 parentNode(node: any): any { return node.parentNode; } // 下一个兄弟节点 nextSibling(node: any): any { return node.nextSibling; } // 设置 setAttribute(el: any, name: string, value: string, namespace?: string): void { // 有命令空间 if (namespace) { ... } else { el.setAttribute(name, value); } } // 删除属性 removeAttribute(el: any, name: string, namespace?: string): void { // 有命令空间的删去 if (namespace) { ... } else { el.removeAttribute(name); } } // 添加class addClass(el: any, name: string): void { el.classList.add(name); } // 删除class removeClass(el: any, name: string): void { el.classList.remove(name); }
export enum RendererStyleFlags2 { Important = 1 << 0, // 1 DashCase = 1 << 1 // 2 } setStyle(el: any, style: string, value: any, flags: RendererStyleFlags2): void { if (flags & (RendererStyleFlags2.DashCase | RendererStyleFlags2.Important)) { el.style.setProperty(style, value, flags & RendererStyleFlags2.Important ? 'important' : ''); } else { el.style[style] = value; } } removeStyle(el: any, style: string, flags: RendererStyleFlags2): void { if (flags & RendererStyleFlags2.DashCase) { el.style.removeProperty(style); } else { // IE 状况下 null为删除样式 el.style[style] = ''; } }
第四个参数是可选参数,默认是添加优先级学习
this.renderer.setStyle(a,'background','red',1) //添加优先级,2是取消优先级 也可使用枚举的形式 this.renderer.setStyle(a,'background','red',RendererStyleFlags2.Important) 也能够直接在第三个参数上添加 this.renderer.setStyle(a,'background','red!important')
修改内置属性动画
// 摇摆树的内容暂时不太懂 const NG_DEV_MODE = typeof ngDevMode === 'undefined' || !!ngDevMode; setProperty(el: any, name: string, value: any): void { NG_DEV_MODE && checkNoSyntheticProp(name, 'property'); el[name] = value; } const AT_CHARCODE = (() => '@'.charCodeAt(0))(); const AT_CHARCODE = '@'.charCodeAt(0); // 思考这两种写法有什么区别... function checkNoSyntheticProp(name: string, nameKind: string) { if (name.charCodeAt(0) === AT_CHARCODE) { throw new Error(`Found the synthetic ${nameKind} ${ name}. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.`); } }
属性name第一个参数不能是
@
this.renderer.setProperty(a,'type','button') // 修改input的type类型
setValue(node: any, value: string): void { node.nodeValue = value; }
let a = document.querySelector('#bbb'); a.childNodes[0].nodeValue='bbb'
nodeValue 文本节点
childNodes 子节点合集
nodeName 节点名称 大写的 DIV
或者其余标签
nodeType 节点类型
案例
<div id="bbb"> dddd </div> 要有文本节点才能添加 let a = document.querySelector('#bbb'); this.renderer.setValue( a.childNodes[0],'eeee')
用法
let a = document.querySelector('#bbb'); this.renderer.listen(a,'click',e=>{ console.log(e); })