Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generates Angular 17+ standalone components, configures advanced routing with lazy loading and guards, implements NgRx state management, applies RxJS patterns, and optimizes bundle performance. Use when building Angular 17+ applications with standalone components or signals, setting up NgRx stores, establishing RxJS reactive patterns, performance tuning, or writing Angular tests for enterprise apps.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 126% | 0% |
| case-13 | ✓→✗ | ▼ Worse | 57% | 0% |
| case-21 | ✓→✓ | = Same ✓ | 111% | 0% |
| case-22 | ✓→✓ | = Same ✓ | 45% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 34% | 0% |
Senior Angular architect specializing in Angular 17+ with standalone components, signals, and enterprise-grade application development.
ng build --configuration production to verify bundle size and flag regressionsLoad detailed guidance based on context:
| Topic | Reference | Load When | |-------|-----------|-----------| | Components | references/components.md | Standalone components, signals, input/output | | RxJS | references/rxjs.md | Observables, operators, subjects, error handling | | NgRx | references/ngrx.md | Store, effects, selectors, entity adapter | | Routing | references/routing.md | Router config, guards, lazy loading, resolvers | | Testing | references/testing.md | TestBed, component tests, service tests |
typescriptimport { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core'; import { CommonModule } from '@angular/common'; @Component({ selector: 'app-user-card', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: ` <div class="user-card"> <h2>{{ fullName() }}</h2> <button (click)="onSelect()">Select</button> </div> `, }) export class UserCardComponent { firstName = input.required<string>(); lastName = input.required<string>(); selected = output<string>(); fullName = computed(() => `${this.firstName()} ${this.lastName()}`); onSelect(): void { this.selected.emit(this.fullName()); } }
takeUntilDestroyedtypescriptimport { Component, OnInit, inject } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { UserService } from './user.service'; @Component({ selector: 'app-users', standalone: true, template: `...` }) export class UsersComponent implements OnInit { private userService = inject(UserService); // DestroyRef is captured at construction time for use in ngOnInit private destroyRef = inject(DestroyRef); ngOnInit(): void { this.userService.getUsers() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe({ next: (users) => { /* handle */ }, error: (err) => console.error('Failed to load users', err), }); } }
typescript// actions export const loadUsers = createAction('[Users] Load Users'); export const loadUsersSuccess = createAction('[Users] Load Users Success', props<{ users: User[] }>()); export const loadUsersFailure = createAction('[Users] Load Users Failure', props<{ error: string }>()); // reducer export interface UsersState { users: User[]; loading: boolean; error: string | null; } const initialState: UsersState = { users: [], loading: false, error: null }; export const usersReducer = createReducer( initialState, on(loadUsers, (state) => ({ ...state, loading: true, error: null })), on(loadUsersSuccess, (state, { users }) => ({ ...state, users, loading: false })), on(loadUsersFailure, (state, { error }) => ({ ...state, error, loading: false })), ); // selectors export const selectUsersState = createFeatureSelector<UsersState>('users'); export const selectAllUsers = createSelector(selectUsersState, (s) => s.users); export const selectUsersLoading = createSelector(selectUsersState, (s) => s.loading);
trackBy functions in *ngFor loopstakeUntilDestroyed or async pipe)any type without justificationWhen implementing Angular features, provide:
Other measured skills in the registry, with their headline benchmark lift.