Angular
<h2>1、数据绑定的四种形式:</h2><p>(1)插值 <p>{{title}}</p></p>
<p>(2)属性绑定 <img ="userUrl"/></p>
<p>(3)事件绑定 <button (click)='onSave()'>点击</button></p>
<p>(4)双向绑定 <input [(ngModel)]='title'/></p>
<p> 在双向绑定中,数据属性值通过属性绑定从组件流到输入框,当修改输入框内容时通过事件绑定流回组件,把属性值设为最新值。</p>
<p> </p>
<p><span style="font-size: 16px"><strong>选择属性绑定还是插值?</strong></span></p>
<p> 当渲染的数据类型是字符串时,倾向于可读性更好的插值;但是当数据类型不是字符串时,必须用属性绑定了。</p>
<p><strong><span style="font-size: 16px">属性绑定与attribute绑定的区别?</span></strong></p>
<p> 用属性绑定来设置元素的属性总是好于用字符串设置attribute,但是当元素没有属性可绑时,就必须用attribute绑定。</p>
<p> 如: colspan不是td的属性</p>
<div class="cnblogs_code">
<pre><tr><td =<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1+1</span><span style="color: rgba(128, 0, 0, 1)">"</span>>One-Two</td></tr></pre>
</div>
<p><strong><span style="font-size: 16px">CSS类绑定</span></strong></p>
<ul>
<li>全有或全无的替换型绑定</li>
</ul>
<p> <div class='bad curly special' ='isTrue'></div></p>
<ul>
<li>绑定到特定类名 单个class的添加与移除</li>
</ul>
<p> <div ='isTrue'></div></p>
<p> 同时添加或移除多个class</p>
<p> <div ="{'background':isBg,'fontColor':isFontColor}"></div></p>
<p><strong><span style="font-size: 16px">样式绑定</span></strong></p>
<ul>
<li>单个样式绑定 <button ="isSpecial?'red':'green'"></button></li>
</ul>
<h2>2、指令</h2>
<p>(1)结构型指令:通过添加、移除或替换DOM来修改布局。如 *ngIf、*ngFor</p>
<p>(2)属性型指令:会修改现有元素的外观或行为。 如 NgClass、NgStyle、NgModel</p>
<p><strong><span style="font-size: 16px">2.1、为什么要给结构型指令加上“*”?</span></strong></p>
<p> 星号是用来简化更复杂语法的“语法糖”,从内部实现来说,Angular把*ngIf属性翻译成了一个<ng-template>元素,并用它来包裹宿主元素</p>
<p> 如<div *ngIf="hero">hero</div> =======》</p>
<p> <ng-template ="hero"><br> <div>hero</div><br> </ng-template></p>
<p><span style="font-size: 16px"><strong>2.2、*ngIf有else</strong></span></p>
<div class="cnblogs_code">
<pre><div *ngIf=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">display else noData</span><span style="color: rgba(128, 0, 0, 1)">"</span>></div>
<ng-template #noData></ng-template></pre>
</div>
<p>在Angular中一个标签上不能同时使用两个指令,可以通过在外层添加一个<ng-container>来解决</p>
<p> </p>
<p class="md-end-block md-heading md-focus"><span style="font-size: 16px"><strong><span class="md-plain md-expand">2.3、<</span><span class="md-plain md-expand">ng-container</span><span class="md-plain md-expand">> VS<</span><span class="md-plain md-expand">ng-template</span><span class="md-plain md-expand">> VS <</span><span class="md-plain md-expand">ng-content</span><span class="md-plain md-expand">></span></strong></span></p>
<p><strong><ng-container></strong>渲染所包含的模板内容,不包含自身</p>
<div class="cnblogs_code">
<pre><div>
<ng-container>
<span>Hello World!</span>
</ng-container>
</div>
<!-- 实际渲染结果是 -->
<div>
<span>Hello World!</span>
</div></pre>
</div>
<p><strong><ng-template></strong>它不会直接渲染任何内容,主要是配合其他的结构型指令一起使用</p>
<div class="cnblogs_code">
<pre><ng-template>
<span>Hello World!</span>
</ng-template>
<!-- 默认不会渲染任何内容 --></pre>
</div>
<p><strong><ng-content></strong>使得这个组件能接收外部投射进来的内容,也就是说组件最终呈现的内容不仅仅是本身定义的那些。</p>
<p>父组件在调用子组件时,还可以在子组件里添加内容,然后在子组件中使用<ng-content>显示那部分内容到该处。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">父组件中调用子组件 app-with-title</span>
<app-with-title>
<div>hello</div>
<div>world</div>
</app-with-title>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">子组件</span>
<div>title</div>
<ng-content></ng-content>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 子组件实际渲染的结果是</span>
<div>title</div>
<div>hello</div>
<div>world</div></pre>
</div>
<p><strong><span style="font-size: 16px">2.4、ng-container 只会展示包含的内容</span></strong></p>
<p>下面的实例,很好的展示了 ng-container 的用法;需求是只展示奇数的数据,如果是同时使用 ngFor 和 ngIf 会报错</p>
<div class="cnblogs_code">
<pre><ul>
<li *ngFor=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">let item of list; let odd = odd</span><span style="color: rgba(128, 0, 0, 1)">"</span> * ngIf=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">odd</span><span style="color: rgba(128, 0, 0, 1)">"</span>><span style="color: rgba(0, 0, 0, 1)">
{{ item }}
</span></li>
</ul></pre>
</div>
<p><span class="md-plain md-expand">会报错,<span>*<span class="md-plain">开头的指令,一个元素只能使用一次</span></span></span></p>
<div class="cnblogs_code">
<pre><ul>
<ng-container *ngFor=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">let item of list; let odd = odd</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<li *ngIf=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">odd</span><span style="color: rgba(128, 0, 0, 1)">"</span>>{{ item }}</li>
</ng-container>
</ul></pre>
</div>
<p><span style="font-size: 16px"><strong>2.5、*ngTemplateOutlet</strong></span></p>
<div class="cnblogs_code">
<pre><ng-template #data><span style="color: rgba(0, 0, 0, 1)">
Hello World
</span></ng-template>
<div *ngTemplateOutlet=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">data</span><span style="color: rgba(128, 0, 0, 1)">"</span>></div></pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">类似 angularJS 里面的 include,加载对应的模块代码块,不过更强大,像是调用一个函数,可以传参</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain">在使用 <span>*<span class="md-plain md-expand">ngTemplateOutlet 的时候,可以加上 context 代表要传入 ng-template 的参数,比如</span></span></span></p>
<div class="cnblogs_code">
<pre><div *ngTemplateOutlet=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">data; context: {$implicit: {value: 1}}</span><span style="color: rgba(128, 0, 0, 1)">"</span>></div>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这个 $implicit 是一个固定用法,就像es6 module中的export default一样, $implicit 后面的值,会被当做传入 ng-template 的默认参数
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在 ng-template 里只需要使用 let-xxx 的方式,就可以接收到这个传入的默认参数</span>
<ng-template #data let-xxx><span style="color: rgba(0, 0, 0, 1)">
{{ xxx </span>|<span style="color: rgba(0, 0, 0, 1)"> json }}
</span></ng-template>
<div *ngTemplateOutlet=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">data; context: {$implicit: {value: 1}}</span><span style="color: rgba(128, 0, 0, 1)">"</span>></div>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用 let-xxx,ng-template 內部就有一个 xxx 变量,这里 xxx 的值就是 {value : 1}</span></pre>
</div>
<p><strong>ng-template 传入多个参数</strong></p>
<p>$implicit 的方式实际上就是 let-xxx="$implicit",如果有多个参数需要传入,可以这样:</p>
<div class="cnblogs_code">
<pre><ng-template #data let-xxx let-another=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">another</span><span style="color: rgba(128, 0, 0, 1)">"</span>>
<div>{{ xxx | json }}</div>
<div>{{ another | json }}</div>
</ng-template>
<<span style="color: rgba(0, 0, 0, 1)">div
</span>*ngTemplateOutlet=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">data; context: {$implicit: {value: 1}, another: {value: 2}}</span><span style="color: rgba(128, 0, 0, 1)">"</span>
></div></pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<h2>3、获取用户数据的方式:</h2>
<p>使用Angular的模板引用变量,这些变量提供了从模板中直接访问元素的能力,在标识符前加上井号# 就能直接声明一个模板引用变量了。</p>
<div class="cnblogs_code">
<pre><input #box/>
<p>{{box.value}}</p><br><br>//按键事件过滤<br><input #box (keyup.enter)="onEnter(box.value)"/><br>onkey(value:string){<br> this.value=value;<br>}</pre>
</div>
<p>通过$event对象取得用户输入</p>
<div class="cnblogs_code">
<pre><input (keyup)=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">onkey($event)</span><span style="color: rgba(128, 0, 0, 1)">"</span>/><span style="color: rgba(0, 0, 0, 1)">
onkey(</span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">:any){
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.value=<span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.target.value;
}</span></pre>
</div>
<p>但是通过$event是靠不住的做法,反对把整个dom事件传入方法中,因为这样组件会知道太多模板的信息,这样就违反了模板和组件之间的分离关注原则了。</p>
<p> </p>
<h2>4、组件间的交互的方式</h2>
<p><strong>(1)父---->子</strong></p>
<p>子组件若接收来自父组件传入的消息,必须定义一个输入属性,该属性通过Input装饰器修饰的。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">子组件child.ts</span>
@Input() <span style="color: rgba(0, 0, 255, 1)">private</span> message:<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">父组件 html</span>
<child =<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msgToChild</span><span style="color: rgba(128, 0, 0, 1)">"</span>></child></pre>
</div>
<p><strong>(2)子----->父</strong></p>
<p>通过输出接口完成</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">子组件 child.ts</span>
@Output() <span style="color: rgba(0, 0, 255, 1)">private</span> outer=<span style="color: rgba(0, 0, 255, 1)">new</span> EventEmitter<<span style="color: rgba(0, 0, 255, 1)">string</span>><span style="color: rgba(0, 0, 0, 1)">();
sendToParent(){
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.outer.emit(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">message from child</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">父组件
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">. html</span>
<child (outer)=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">recieve($event)</span><span style="color: rgba(128, 0, 0, 1)">"</span>></child>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.ts </span>
<span style="color: rgba(0, 0, 255, 1)">private</span> msgFromChild:<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
recieve($e:any){
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.msgFromChild=<span style="color: rgba(0, 0, 0, 1)">$e;
}</span></pre>
</div>
<p>(3)父子组件通过本地变量互动</p>
<p>父组件不能使用数据绑定来读取子组件的属性或调用子组件的方法,但是,可以在父组件的模板中,新建一个本地变量来代表子组件,然后利用这个变量来读取子组件的属性和调用子组件的方法。</p>
<div class="cnblogs_code">
<pre>//html文件<br><child #children></child> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">子组件</span>
<button (click)=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">children.start()</span><span style="color: rgba(128, 0, 0, 1)">"</span>></button></pre>
</div>
<p>(4)@viewChild()</p>
<p>两种用法:1、读取子组件</p>
<p>如果父组件的类需要读取子组件的值或方法,就不能使用本地变量的方法了。当父组件需要这种访问时,可以把子组件作为viewChild注入到父组件中</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">html文件</span>
<child></child> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">子组件</span>
<button (click)=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">start()</span><span style="color: rgba(128, 0, 0, 1)">"</span>></button>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ts文件</span>
import { child} <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./components/child.component</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
@viewChild(child);
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> sonComponent:child;
start(){
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">. sonComponent.start();
}</span></pre>
</div>
<p>@viewChild()的另一种用法:2、获取当前组件视图的单个元素</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.html</span>
<input #name/>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.ts</span>
@viewChild(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) myName:ElementRef;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.myName.nativeElement.focus();</pre>
</div>
<p> <strong>(5)同级组件间通信</strong></p>
<ul>
<li>共用服务</li>
</ul>
<p> 两个组件同时调用某个服务,需要发送数据的组件调用该服务的方法,需要接收该信息的组件,可以定义一个观察者对象,监听数据变化。</p>
<ul>
<li>$rootscope实现作用域间通信</li>
</ul>
<p> </p>
<h2>5、路由</h2>
<p><router-outlet></router-outlet>把要显示在这个出口处的组件显示在这里。</p>
<p>路由跳转</p>
<div class="cnblogs_code">
<pre><a routerLink=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/heroes</span><span style="color: rgba(128, 0, 0, 1)">"</span> routerLinkActive=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">active</span><span style="color: rgba(128, 0, 0, 1)">"</span>>Heroes</a>
<a routerLink=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">['/heroes']</span><span style="color: rgba(128, 0, 0, 1)">"</span>>Heroes</a>
<a routerLink=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"></span><span style="color: rgba(128, 0, 0, 1)">"</span>+row.id>Heroes</a><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据id跳转
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">routerLinkActive表示当链接激活时添加“active”类</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.router.navigate([<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/home</span><span style="color: rgba(128, 0, 0, 1)">'</span>]);在ts文件中</pre>
</div>
<p> </p>
<p>根据参数跳转路由:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
path:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">home/:id</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
component:HomeComponent
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取参数id
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">(1)</span>
constructor(<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> route:ActivatedRoute){
route.</span><span style="color: rgba(0, 0, 255, 1)">params</span>.subscribe(<span style="color: rgba(0, 0, 255, 1)">params</span>=>{<span style="color: rgba(0, 0, 255, 1)">this</span>.id=<span style="color: rgba(0, 0, 255, 1)">params</span>[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]})
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">(2)</span>
constructor(<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> route:ActivatedRoute){}
</span><span style="color: rgba(0, 0, 255, 1)">const</span> id=<span style="color: rgba(0, 0, 255, 1)">this</span>.route.snapshot.paramMap.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">'</span>);</pre>
</div>
<p> </p>
<h2>6、管道</h2>
<p>把数据作为输入,然后转换它,给出期望的输出。</p>
<div class="cnblogs_code">
<pre><p>Hero`s birthdat <span style="color: rgba(0, 0, 255, 1)">is</span> {{birthday | date}}</p></pre>
</div>
<p>让组件的birthday值通过管道操作符(|)流动到右侧的date管道函数中,所有管道都会用这种方式工作。</p>
<p> </p>
<h2>7、服务与依赖注入</h2>
<p>为什么要用服务?</p>
<p>通常需要对访问的数据做后处理、添加错误处理器,还可能加一些重试逻辑,以便应对网络问题。如果直接写在组件中,会因为这些数据方式的细节而变得杂乱不堪,组件变得难以理解,难以测试,并且这些数据访问逻辑无法被复用,也无法标准化,所以把数据展示逻辑与数据访问逻辑分开。</p>
<p>Angular把组件与服务区分开,以提高模块性和复用性。通过把组件中和视图相关的功能与其他类型的处理分离开,可以使组件类更精简、高效。</p>
<p>组件应该把诸如从服务器获取数据、验证用户输入等工作委托给服务。</p>
<p>依赖注入:是组件引入外部构建(如服务)的一种机制。</p>
<p> </p>
<h2>8、Angular双向绑定实现原理</h2>
<p>Angular在scope模型上设置了一个监听队列,用来监听数据变化并更新视图。每次绑定一个数据或事件时angular就会往$watch队列中插入一条$watch,用来检测它监听的模型里是否有变化的内容。当浏览器接收到可以被Angular context处理的事件时,就会触发$digest循环,遍历所有的$watch检查其属性和值是否发生变化, 最后更新DOM。</p>
<p>实现方法:</p>
<p>(1)每个双向绑定的元素都有一个watcher;</p>
<p>(2)在某些事件发生时,调用digest对脏数据进行检测,这些事件有表单内容发生变化、Ajax请求响应、单击按钮执行回调函数等。</p>
<p>(3)脏数据检测,会检测到rootscope下所有被watcher监控的元素。 $digest函数就是脏数据检测函数。</p>
<p>如:</p>
<ul>
<li>当我们点击按钮时,浏览器接收一个事件,进入angular context。</li>
<li>$digest循坏开始执行,查询每个$watch是否变化。</li>
<li>由于监听$scope.name的$watch报告了变化,他会强制再执行一次$digest循环。</li>
<li>新的$digest循环没有检测到变化。</li>
<li>更新与$digest.name 新值相应部分的DOM。</li>
</ul>
<p> </p>
<h2>9、Angular生命周期</h2>
<p>(1)ngOnChanges:当数据绑定输入属性的值发生变化时调用,初始化前也会被调用一次。</p>
<p>(2)ngOnInit:初始化</p>
<p>(3)ngDoCheck:自定义的方法,用于检测和处理值的改变</p>
<p>(4)ngAfterContentInit:在组件内容初始化之后调用</p>
<p>(5)ngAfterContentChecked:组件每次检查内容时更新</p>
<p>(6)ngAfterViewInit:组件相应的视图初始化之后调用</p>
<p>(7)ngAfterViewChecked:组件每次检查视图时调用</p>
<p>(8)ngOnDestory:指令销毁前调用。</p>
<p> </p>
<h2>10、ng-if与ng-show的区别</h2>
<p>(1)ng-if在表达式为true的时候才会创建这个dom节点,ng-show是初始时就创建了,只用用display来控制显示与隐藏。</p>
<p>(2)ng-if会(隐式地)产生新作用域,ng-switch、ng-include等会动态创建一块界面的也是如此。</p>
<p>这样会导致在ng-if中用基本变量绑定ng-model,在外层div中把此model绑定给另一个显示区域,内层改变时,外层不会同步改变,因为此时已经是两个变量了。</p>
<p> <img src="https://img2018.cnblogs.com/blog/1313634/201909/1313634-20190911155335069-621338363.png"></p>
<p> ng-show不存在这个问题,因为它不自带一级作用域。</p>
<p> 避免这一问题出现的方法是:始终将页面中的元素绑定到对象的属性(data.x)上,而不是直接绑定到基本变量(x)上。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/xiaoan0705/p/11137178.html
頁:
[1]