アングラーの変化検出
2558 ワード
Change Detection(変化検出)はAnglar 2の最も重要な特性である.アングラー2は、コンポーネント内のデータが変化すると、データの変化を検出し、自動的にビューを更新して対応する変化を反映することができる.
変化検出を紹介する前に、まずブラウザでレンダリングする概念を紹介します.レンダリングはモデルをビューに写像する過程です.モデルの値は、JavaScriptにおける元のデータタイプ、オブジェクト、配列、または他のデータオブジェクトとすることができる.しかし、ビューは、ページ内の段落、フォーム、ボタンなどの他の要素とすることができ、これらのページ要素の内部にはDOM(Document Object Model)を使用して表されています.よりよく理解するために、具体的な例を見てみます.
変化検出を紹介する前に、まずブラウザでレンダリングする概念を紹介します.レンダリングはモデルをビューに写像する過程です.モデルの値は、JavaScriptにおける元のデータタイプ、オブジェクト、配列、または他のデータオブジェクトとすることができる.しかし、ビューは、ページ内の段落、フォーム、ボタンなどの他の要素とすることができ、これらのページ要素の内部にはDOM(Document Object Model)を使用して表されています.よりよく理解するために、具体的な例を見てみます.
document.getElementById("greeting").innerHTML = "Hello World!";
这个例子很简单,因为模型不会变化,所以页面只会渲染一次。如果数据模型在运行时会不断变化,那么整个过程将变得复杂。因此为了保证数据与视图的同步,页面将会进行多次渲染。接下来我们来考虑一下以下几个问题:
1、什么时候模型会发生变化
2、模型产生了什么变化
3、变化后需要更新的视图区域在哪里
4、怎么更新对应视图区域
而变化检测的基本目的就是解决上述问题。在 Angular 2 中当组件内的模型发生变化的时候,组件内的变化检测器就会检测到更新,然后通知视图刷新。因此变化检测器有两个主要的任务:
1、检测模型的变化
2、通知视图刷新
接下来我们来分析一下什么是变化,变化是怎么产生的。
变化和事件
变化是旧模型与新模型之间的区别,换句话说变化产生了一个新的模型。让我们来看一下下面的代码:
import { Component } from '@angular/core'; @Component({
selector: 'exe-counter',
template: `
:{{ counter }}
` }) export class CounterComponent {
counter = 0;
countUp() { this.counter++;
}
}
ページの最初のレンダリングが完了したら、カウンタの現在値は0です.+ボタンをクリックするとカウンタのカウンタ値が自動的に1加算され、その後もページの現在値が更新されます.この例では、クリックイベントは、counter属性値の変化を引き起こす.次の例を見続けます.import { Component, OnInit } from '@angular/core'; @Component({
selector: 'exe-counter',
template: `
:{{ counter }}
` }) export class CounterComponent implements OnInit {
counter = 0;
ngOnInit() {
setInterval(() => { this.counter++;
}, 1000);
}
}
このコンポーネントはset Intervalタイマーによって、一秒ごとにカウンタ値が自動的に1ずつ加算されます.この場合、タイマーイベントであり、属性値の変化を引き起こす.最後にもう一度例を見ます.import { Component, OnInit } from '@angular/core'; import { Http } from '@angular/http'; @Component({
selector: 'exe-counter',
template: `
:{{ counter }}
` }) 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;
});
}
}
このコンポーネントは初期化を行うと、HTTP要求を送信して初期値を取得します.要求が成功的に戻ると、コンポーネントのカウンタ属性の値が更新されます.この場合,XHR反転によって属性値の変化が生じる.モデルの変化を引き起こす三つのイベントソースをまとめます.1、Events:click、mouseover、keyup…2、Timers:set Interval、set Timeout 3、XHRs:Ajax(GET、POST…)これらのイベントソースには共通の特性があります.すべての非同期動作がモデルの変化を引き起こす可能性があると考えられます.