Eine moderne Angular 20 Anwendung mit Posts- und Comments-Listen, performanter Virtual-Scrolling-Ansicht und Such-Highlighting.
Eine moderne Angular 20 App mit striktem TypeScript, Signals, eigenem Highlight-Pipe, wiederverwendbaren UI-Komponenten und performanter Virtual-Scrolling-Liste (Angular CDK) für große Datenmengen.
Build-/Serve-Konfiguration: Angular CLI Application Builder, SCSS, Production-Defaults mit Budgets.
Stack/Versions (Angular 20.1.x, RxJS 7.8, TS 5.8), Prettier-Override für HTML.
Strict TypeScript & Angular Compiler Options.
- Angular 20 (standalone components) mit Signals für lokalen State
- Virtual Scrolling via
cdk-virtual-scroll-viewportfür Comments (flüssig bei tausenden Einträgen) - Such-Highlighting (eigene
HighlightPipemit sichereninnerHTML) - Wiederverwendbare UI:
InputComponent, Buttons - Reactive Forms (Debounce-Suche)
- Saubere Services mit
HttpClient, konfigurierbare API-Base-URL (src/config/appConfig.json) - Strict TypeScript + strikte Angular-Template-Prüfungen
- Unit Tests mit Jasmine/Karma
git clone https://github.com/payam2104/posts.git
cd posts
npm install
npm startLäuft unter: http://localhost:4200/
API-Basis wird in src/config/appConfig.json gesetzt:
{
"urlPrefix": "",
"apiUri": "https://jsonplaceholder.typicode.com"
}Die Services bauen Endpunkte daraus, z. B. https://jsonplaceholder.typicode.com/posts und .../comments.
src/
├─ app/
│ ├─ components/
│ │ ├─ posts-list/ # Liste der Posts (+ Suche/Sortierung)
│ │ └─ comments-list/ # Comments mit Virtual Scrolling
│ │
│ └─ core/
│ ├─ models/ # Post, Comment Models
│ ├─ pipes/highlight.pipe.ts
│ ├─ services/
│ │ ├─ post-service/
│ │ └─ comment-service/
│ └─ utils/url-constants.ts
├─ config/appConfig.json # API-Base-URL
├─ main.ts
└─ styles.scssBuilder/Assets/Styles sind in angular.json gepflegt (SCSS, public als Assets), inkl. Production-Budgets.
// src/app/app.routes.ts
[
{ path: '', loadComponent: () => import('./components/posts-list/posts-list').then(c => c.PostsList) },
{ path: 'components', loadComponent: () => import('./components/comments-list/comments-list').then(c => c.CommentsList) }
]- / → PostsList
- /components → CommentsList (Virtual Scrolling)
- Lädt alle Posts (Service) und hält State in Signals
- Suche mit Highlighting:
HighlightPipeumschließt Matches mit<span class="highlight"> - Sortierung per Klick auf Header (ID/Titel)
- Reactive Form +
debounceTimefür angenehme Eingabe
cdk-virtual-scroll-viewport+ `*cdkVirtualFor für performantes RenderingtrackByaufidreduziert Change Detection- Dynamische
itemSize+ Resize-Handling für responsive Zeilenhöhe - Paging/Append: Service stellt Methode zum Anhängen neuer Kommentare bereit (für spätere Infinite-Scroll-Erweiterung)
PostService&CommentServicenutzenHttpClient, endenden auf.../postsbzw. `.../comments; State via SignalsHelper.tsbaut die vollständige API-URL aus der Config- Modelle in
core/modelskapseln API-Strukturen (z. B.Post,Comment)
- Strict Mode: Achte auf explizite Typen, keine impliziten Any-Casts, strikte Template-Typprüfung.
- Performance:
- In
CommentsListunbedingttrackBybeibehalten cdkVirtualForstatt@for/*ngForfür große Listen- Teure Berechnungen in
computed()kapseln; reaktive Ableitungen statt manueller Mutationen
- In
- Security:
HighlightPipeverwendetDomSanitizer– nur auf bekannten Textquellen einsetzen
Payam Koushkbaghi