淺談Angular 的變化檢測(cè)的方法
Change Detection (變化檢測(cè)) 是 Angular 2 中最重要的一個(gè)特性。當(dāng)組件中的數(shù)據(jù)發(fā)生變化的時(shí)候,Angular 2 能檢測(cè)到數(shù)據(jù)變化并自動(dòng)刷新視圖反映出相應(yīng)的變化。
在介紹變化檢測(cè)之前,我們要先介紹一下瀏覽器中渲染的概念,渲染是將模型映射到視圖的過(guò)程。模型的值可以是 JavaScript 中的原始數(shù)據(jù)類型、對(duì)象、數(shù)組或其他數(shù)據(jù)對(duì)象。然而視圖可以是頁(yè)面中的段落、表單、按鈕等其他元素,這些頁(yè)面元素內(nèi)部使用 DOM(Document Object Model) 來(lái)表示,為了更好地理解,我們來(lái)看一個(gè)具體的示例:
<h4 id="greeting"></h4> <script> document.getElementById("greeting").innerHTML = "Hello World!"; </script>
這個(gè)例子很簡(jiǎn)單,因?yàn)槟P筒粫?huì)變化,所以頁(yè)面只會(huì)渲染一次。如果數(shù)據(jù)模型在運(yùn)行時(shí)會(huì)不斷變化,那么整個(gè)過(guò)程將變得復(fù)雜。因此為了保證數(shù)據(jù)與視圖的同步,頁(yè)面將會(huì)進(jìn)行多次渲染。接下來(lái)我們來(lái)考慮一下以下幾個(gè)問(wèn)題:
1、什么時(shí)候模型會(huì)發(fā)生變化
2、模型產(chǎn)生了什么變化
3、變化后需要更新的視圖區(qū)域在哪里
4、怎么更新對(duì)應(yīng)視圖區(qū)域
而變化檢測(cè)的基本目的就是解決上述問(wèn)題。在 Angular 2 中當(dāng)組件內(nèi)的模型發(fā)生變化的時(shí)候,組件內(nèi)的變化檢測(cè)器就會(huì)檢測(cè)到更新,然后通知視圖刷新。因此變化檢測(cè)器有兩個(gè)主要的任務(wù):
1、檢測(cè)模型的變化
2、通知視圖刷新
接下來(lái)我們來(lái)分析一下什么是變化,變化是怎么產(chǎn)生的。
變化和事件
變化是舊模型與新模型之間的區(qū)別,換句話說(shuō)變化產(chǎn)生了一個(gè)新的模型。讓我們來(lái)看一下下面的代碼:
import { Component } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>當(dāng)前值:{{ counter }}</p> <button (click)="countUp()"> + </button>` }) export class CounterComponent { counter = 0; countUp() { this.counter++; } }
頁(yè)面首次渲染完后,計(jì)數(shù)器的當(dāng)前值為0。當(dāng)我們點(diǎn)擊 + 按鈕時(shí),計(jì)數(shù)器的 counter 值將會(huì)自動(dòng)加1,之后頁(yè)面中當(dāng)前值也會(huì)被更新。在這個(gè)例子中,點(diǎn)擊事件引起了 counter 屬性值的變化。
我們繼續(xù)看下一個(gè)例子:
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>當(dāng)前值:{{ counter }}</p> ` }) export class CounterComponent implements OnInit { counter = 0; ngOnInit() { setInterval(() => { this.counter++; }, 1000); } }
該組件通過(guò) setInterval 定時(shí)器,實(shí)現(xiàn)每秒鐘 counter 值自動(dòng)加1。在這種情況下,它是定時(shí)器事件引起了屬性值的變化。最后我們?cè)賮?lái)看個(gè)例子:
import { Component, OnInit } from '@angular/core'; import { Http } from '@angular/http'; @Component({ selector: 'exe-counter', template: ` <p>當(dāng)前值:{{ counter }}</p> ` }) export class CounterComponent implements OnInit { counter = 0; constructor(private http: Http) {} ngOnInit() { this.http.get('/counter-data.json') .map(res => res.json()) .subscribe(data => { this.counter = data.value; }); } }
該組件在進(jìn)行初始化的時(shí)候,會(huì)發(fā)送一個(gè) HTTP 請(qǐng)求去獲取初始值。當(dāng)請(qǐng)求成功返回的時(shí)候,組件的 counter 屬性的值會(huì)被更新。在這種情況下,它是由 XHR 回調(diào)引起了屬性值的變化。
現(xiàn)在我們來(lái)總結(jié)一下,引起模型變化的三類事件源:
1、Events:click, mouseover, keyup ...
2、Timers:setInterval、setTimeout
3、XHRs:Ajax(GET、POST ...)
這些事件源有一個(gè)共同的特性,即它們都是異步操作。那我們可以這樣認(rèn)為,所有的異步操作都有可能會(huì)引起模型的變化。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
不能不知道的10個(gè)angularjs英文學(xué)習(xí)網(wǎng)站
這篇文章主要為大家分享了10個(gè)大家不能不知道的angularjs英文網(wǎng)站,供大家學(xué)習(xí),感興趣的小伙伴們可以參考一下2016-03-03Angularjs在初始化未完畢時(shí)出現(xiàn)閃爍問(wèn)題的解決方法分析
這篇文章主要介紹了Angularjs在初始化未完畢時(shí)出現(xiàn)閃爍問(wèn)題的解決方法,結(jié)合實(shí)例形式分析了3種常用的閃爍問(wèn)題解決方法,需要的朋友可以參考下2016-08-08在AngularJS框架中處理數(shù)據(jù)建模的方式解析
這篇文章主要介紹了在AngularJS框架中處理數(shù)據(jù)建模的方式,作者同時(shí)也對(duì)AngularJS使用過(guò)程中的一些"坑"作了介紹,需要的朋友可以參考下2016-03-03使用AngularJS編寫(xiě)多選按鈕選中時(shí)觸發(fā)指定方法的指令代碼詳解
最近做項(xiàng)目時(shí)遇到了需要用到多選按鈕選中觸發(fā)事件的功能,小編試著手寫(xiě)一個(gè)指令,具體實(shí)現(xiàn)代碼大家參考下本文吧2017-07-07Angular 4根據(jù)組件名稱動(dòng)態(tài)創(chuàng)建出組件的方法教程
組件是我們?cè)趯W(xué)習(xí)angular中必不可少的一部分,下面這篇文章主要給大家介紹了關(guān)于Angular 4如何根據(jù)組件名稱動(dòng)態(tài)創(chuàng)建出組件的相關(guān)資料,文中通過(guò)圖文與示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11基于datepicker定義自己的angular時(shí)間組件的示例
這篇文章主要介紹了基于datepicker定義自己的angular時(shí)間組件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03詳解使用KeyValueDiffers檢測(cè)Angular對(duì)象的變化
這篇文章主要為大家介紹了KeyValueDiffers檢測(cè)Angular對(duì)象的變化使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04淺談angular2的http請(qǐng)求返回結(jié)果的subcribe注意事項(xiàng)
下面小編就為大家?guī)?lái)一篇淺談angular2的http請(qǐng)求返回結(jié)果的subcribe注意事項(xiàng)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Angular.js中window.onload(),$(document).ready()的寫(xiě)法淺析
這篇文章主要介紹了Angular.js中window.onload(),$(document).ready()的寫(xiě)法淺析,需要的朋友可以參考下2017-09-09