Step 14: Change Detection Fixed

The Solution

By splitting the search input and card list into separate components, we prevent unnecessary re-renders of the cards when typing.

Benefits:

  • Search input changes don't affect card list
  • OnPush change detection works effectively
  • Better component isolation
  • Improved performance

Fixed Code:


// Separate search component
@Component({
  selector: 'app-search-box',
  template:
    <input [(ngModel)]="searchTerm" (ngModelChange)="search.emit($event)">

})
export class SearchBoxComponent {
@Output() search = new EventEmitter<string>();
}

// Separate cards list component
@Component({
  selector: 'app-cards-list',
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class CardsListComponent {
@Input() cards: Card[] = [];
}

// Parent component
@Component({
  template:
    <app-search-box (search)="onSearch($event)"></app-search-box>
    <app-cards-list [cards]="filteredCards"></app-cards-list>

})
          

Type in the search box below and watch the console. Notice how the cards only re-render when the filtered results change, not on every keystroke.

Learn more about better design of components here.

Last filter update: 7:56:46 PM
Card 1

Card 1

Renders: 1

Card 2

Card 2

Renders: 1

Card 3

Card 3

Renders: 1

Card 4

Card 4

Renders: 1

Card 5

Card 5

Renders: 1

Card 6

Card 6

Renders: 1

Card 7

Card 7

Renders: 1

Card 8

Card 8

Renders: 1

Card 9

Card 9

Renders: 1

Card 10

Card 10

Renders: 1

Card 11

Card 11

Renders: 1

Card 12

Card 12

Renders: 1

Card 13

Card 13

Renders: 1

Card 14

Card 14

Renders: 1

Card 15

Card 15

Renders: 1

Card 16

Card 16

Renders: 1

Card 17

Card 17

Renders: 1

Card 18

Card 18

Renders: 1

Card 19

Card 19

Renders: 1

Card 20

Card 20

Renders: 1

Card 21

Card 21

Renders: 1

Card 22

Card 22

Renders: 1

Card 23

Card 23

Renders: 1

Card 24

Card 24

Renders: 1

Card 25

Card 25

Renders: 1

Card 26

Card 26

Renders: 1

Card 27

Card 27

Renders: 1

Card 28

Card 28

Renders: 1

Card 29

Card 29

Renders: 1

Card 30

Card 30

Renders: 1

Card 31

Card 31

Renders: 1

Card 32

Card 32

Renders: 1

Card 33

Card 33

Renders: 1

Card 34

Card 34

Renders: 1

Card 35

Card 35

Renders: 1

Card 36

Card 36

Renders: 1

Card 37

Card 37

Renders: 1

Card 38

Card 38

Renders: 1

Card 39

Card 39

Renders: 1

Card 40

Card 40

Renders: 1

Card 41

Card 41

Renders: 1

Card 42

Card 42

Renders: 1

Card 43

Card 43

Renders: 1

Card 44

Card 44

Renders: 1

Card 45

Card 45

Renders: 1

Card 46

Card 46

Renders: 1

Card 47

Card 47

Renders: 1

Card 48

Card 48

Renders: 1

Card 49

Card 49

Renders: 1

Card 50

Card 50

Renders: 1