Change Detection (變化檢測) 是 Angular 2 中最重要的一個特性。當(dāng)組件中的數(shù)據(jù)發(fā)生變化的時候,Angular 2 能檢測到數(shù)據(jù)變化并自動刷新視圖反映出相應(yīng)的變化。
在介紹變化檢測之前,我們要先介紹一下瀏覽器中渲染的概念,渲染是將模型映射到視圖的過程。模型的值可以是 JavaScript 中的原始數(shù)據(jù)類型、對象、數(shù)組或其他數(shù)據(jù)對象。然而視圖可以是頁面中的段落、表單、按鈕等其他元素,這些頁面元素內(nèi)部使用 DOM(Document Object Model) 來表示,為了更好地理解,我們來看一個具體的示例:
代碼如下:
<h4 id="greeting"></h4> <script> document.getElementById("greeting").innerHTML = "Hello World!"; </script>
這個例子很簡單,因為模型不會變化,所以頁面只會渲染一次。如果數(shù)據(jù)模型在運行時會不斷變化,那么整個過程將變得復(fù)雜。因此為了保證數(shù)據(jù)與視圖的同步,頁面將會進行多次渲染。接下來我們來考慮一下以下幾個問題:
1、什么時候模型會發(fā)生變化
2、模型產(chǎn)生了什么變化
3、變化后需要更新的視圖區(qū)域在哪里
4、怎么更新對應(yīng)視圖區(qū)域
而變化檢測的基本目的就是解決上述問題。在 Angular 2 中當(dāng)組件內(nèi)的模型發(fā)生變化的時候,組件內(nèi)的變化檢測器就會檢測到更新,然后通知視圖刷新。因此變化檢測器有兩個主要的任務(wù):
1、檢測模型的變化
2、通知視圖刷新
接下來我們來分析一下什么是變化,變化是怎么產(chǎn)生的。
變化和事件
變化是舊模型與新模型之間的區(qū)別,換句話說變化產(chǎn)生了一個新的模型。讓我們來看一下下面的代碼:
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++; } }
頁面首次渲染完后,計數(shù)器的當(dāng)前值為0。當(dāng)我們點擊 + 按鈕時,計數(shù)器的 counter 值將會自動加1,之后頁面中當(dāng)前值也會被更新。在這個例子中,點擊事件引起了 counter 屬性值的變化。
我們繼續(xù)看下一個例子:
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); } }
該組件通過 setInterval 定時器,實現(xiàn)每秒鐘 counter 值自動加1。在這種情況下,它是定時器事件引起了屬性值的變化。最后我們再來看個例子:
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; }); } }
該組件在進行初始化的時候,會發(fā)送一個 HTTP 請求去獲取初始值。當(dāng)請求成功返回的時候,組件的 counter 屬性的值會被更新。在這種情況下,它是由 XHR 回調(diào)引起了屬性值的變化。
現(xiàn)在我們來總結(jié)一下,引起模型變化的三類事件源:
1、Events:click, mouseover, keyup ...
2、Timers:setInterval、setTimeout
3、XHRs:Ajax(GET、POST ...)
這些事件源有一個共同的特性,即它們都是異步操作。那我們可以這樣認(rèn)為,所有的異步操作都有可能會引起模型的變化。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com