https://angular-checklist.io
@Component({
...
})
export class DumbComponent {
@Input() data: unknown;
@Output() someEvent = new EventEmitter<unknown>();
}@Component({
...
})
export class DumbComponent {
@Input() data: Observable<unknown>;
}<div *ngIf="data.name">
<dumb-component-name>
{{data.name}}
</dumb-component-name>
</div>@Component({
...
})
export class DumbComponent implements OnInit {
ngOnInit() {
this.apiService.fetchExtraInfo()
.subscribe(x => this.extraInfo = x);
}
}@Component({
...
})
export class UserComponent implements OnInit {
@Input() user: User;
}<ng-container *ngIf="user">
<h3>{{ user.name }}</h3>
<h5>{{ user.lastName}}</h5>
</ng-container>It should only be used to
visualize data
@Component({
...
})
export class SmartComponent implements OnInit {
ngOnInit() {
this.apiService.getUser()
.subscribe(u => this.user = u);
}
updateUsername(username:string){
this.apiService.updateUsername(username)
.subscribe(...);
}
}
<user-profile [username]="user.name" [pictureUrl]="user.pictureUrl">
</user-profile >
<user-profile [user]="user"
(pictureClicked)="onUserPictureClicked($event)">
</user-profile > @Component({
...
})
export class SmartComponent implements OnInit {
users$:Observable<User>;
ngOnInit() {
this.users$ = this.apiService.getUsers();
}
onUserSelected(user:User){
this.dialog.open(UpdateUserComponent, {data: user});
}
}<ng-container *ngFor="let user of (users$ | async)">
<user-info [user]="user" (click)="onUserSelected(user)">
</user-info>
</ng-container>Component used to orchestrate data
@Component({
...
})
export class Component implements OnInit, OnDestroy {
subscription :Subscription;
ngOnInit() {
const source = interval(1000);
this.subscription = source.subscribe(val => console.log(val));
}
ngOnDestroy(){
this.subscription.unsubscribe();
}
}<div *ngIf="users && users.length > 1 && visible">
<span> {{user.name}} </span>
<span> {{user.lastName}} </span>
</div>@Component({
...
})
export class SomeComponent {
users: User[];
visible: boolean;
usersExistsAndVisible() {
return this.users && this.users.length > 1 && this.visible;
}
}<div *ngIf="usersExistsAndVisible()">
<span> {{user.name}} </span>
<span> {{user.lastName}} </span>
</div> <video-thumbnail *ngFor="let video of videos; trackBy: trackById" [video]="video">
</video-thumbnail>@Component({
...
})
export class SomeComponent {
videos: Video[];
trackById(index, item) {
return item.id;
}
}// hold a reference to the subscription object
const subscription = interval(1000).subscribe(console.log);
// use the subscription object to kill the subscription
subscription.unsubscribe();Not very helpful to manage multiple subscriptions
@Component({
template: `{{data$ | async}}`,
...
})
export class SomeComponent {
data$ = interval(1000);
}@Component({
...
})
export class SomeComponent {
ngOnInit() {
source.pipe(take(1)).subscribe(val => console.log(val));
}
}@Component({...})
export class SomeComponent implements OnInit, OnDestroy {
private destroy$ = new Subject();
users: Array<User>;
groups: Array<Group>;
constructor(private usersService: UsersService) {}
ngOnInit() {
// long-living stream of users
this.usersService.getUsers()
.pipe(
takeUntil(this.destroy$)
)
.subscribe(
users => this.users = users;
);
// long-living stream of groups
this.usersService.getGroups()
.pipe(
takeUntil(this.destroy$)
)
.subscribe(
groups => this.groups= groups;
);
}
ngOnDestroy() {
this.destroy$.next();
}
}