Skip to content

Universal Async & Signal Sources

ngx-skeleton-suite automatically detects and unwraps Promises, RxJS Observables, and Angular Signals directly inside the template.

1. RxJS Observables (*skeleton="let user from user$")

Section titled “1. RxJS Observables (*skeleton="let user from user$")”
import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { SkeletonDirective } from 'ngx-skeleton-suite';
@Component({
standalone: true,
imports: [SkeletonDirective],
template: `
<div *skeleton="let user from user$; preset: 'profile-card'">
<div class="user-card">
<h2>{{ user.name }}</h2>
<p>{{ user.role }}</p>
</div>
</div>
`
})
export class UserProfileComponent {
user$: Observable<UserData> = this.userService.getUser();
}

2. Promises (*skeleton="let data from dataPromise")

Section titled “2. Promises (*skeleton="let data from dataPromise")”
@Component({
standalone: true,
imports: [SkeletonDirective],
template: `
<div *skeleton="let data from fetchPromise; preset: 'card'">
<div class="card">{{ data.title }}</div>
</div>
`
})
export class PromiseDemoComponent {
fetchPromise = fetch('/api/data').then(res => res.json());
}

3. Angular Signals (*skeleton="isLoading()")

Section titled “3. Angular Signals (*skeleton="isLoading()")”
@Component({
standalone: true,
imports: [SkeletonDirective],
template: `
<div *skeleton="isLoading(); preset: 'paragraph'">
<p>{{ articleText() }}</p>
</div>
`
})
export class SignalDemoComponent {
readonly isLoading = signal(true);
readonly articleText = signal('Loaded content...');
}