• 变化检测如何工作

    变化检测如何工作

    让我们用一个简单的例子看看变化检测如何工作。

    我们将创建一个简单的MovieApp来显示一个电影的信息。 这个应用程序将只包含两个组件:MovieComponent显示有关电影的信息和MainComponent,它使用按钮来保存对电影的引用以执行一些动作。

    我们的AppComponent组件将有三个属性:应用程序的slogan,电影的title(标题)和actor(主角)。 最后两个属性将被传递到模板中引用的MovieComponent元素。

    app/app.component.ts

    1. import {Component} from '@angular/core';
    2. import {MovieComponent} from './movie.component';
    3. import {Actor} from './actor.model';
    4. @Component({
    5. selector: 'main',
    6. template: `
    7. <h1>MovieApp</h1>
    8. <p>{{ slogan }}</p>
    9. <button type="button" (click)="changeActorProperties()">Change Actor Properties</button>
    10. <button type="button" (click)="changeActorObject()">Change Actor Object</button>
    11. <movie [title]="title" [actor]="actor"></movie>`
    12. })
    13. export class MainComponent {
    14. slogan: string = 'Just movie information';
    15. title: string = 'Terminator 1';
    16. actor: Actor = new Actor('Arnold', 'Schwarzenegger');
    17. changeActorProperties() {
    18. this.actor.firstName = 'Nicholas';
    19. this.actor.lastName = 'Cage';
    20. }
    21. changeActorObject() {
    22. this.actor = new Actor('Bruce', 'Willis');
    23. }
    24. }

    在上面的代码片段中,我们可以看到我们的组件定义了两个触发不同方法的按钮。 changeActorProperties将通过直接更改actor对象的属性来更新电影的主角。 相反,方法changeActorObject将通过创建一个完全新的Actor类实例来改变actor的信息。

    Actor模型非常简单,它只是一个定义了actorfirstNamelastName的类。

    app/actor.model.ts

    1. export class Actor {
    2. constructor(
    3. public firstName: string,
    4. public lastName: string) {}
    5. }

    最后,MovieComponent显示了MainComponent在其模板中提供的信息。

    app/movie.component.ts

    1. import {Component, Input} from '@angular/core';
    2. import {Actor} from './actor.model';
    3. @Component({
    4. selector: 'movie',
    5. styles: ['div {border: 1px solid black}'],
    6. template: `
    7. <div>
    8. <h3>{{ title }}</h3>
    9. <p>
    10. <label>Actor:</label>
    11. <span>{{actor.firstName}} {{actor.lastName}}</span>
    12. </p>
    13. </div>`
    14. })
    15. export class MovieComponent {
    16. @Input() title: string;
    17. @Input() actor: Actor;
    18. }

    View Example