com um clique
angular-routing
Generates Angular routing configurations and navigation patterns
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
Generates Angular routing configurations and navigation patterns
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
Generates Angular animations for smooth UI transitions and interactions
Generates Angular components with best practices and patterns
Generates an Angular dialog component extending BaseDialogComponent
Generates Angular directives for DOM manipulation and behavior enhancement
Generates Angular error boundary components for graceful error handling
Generates an Angular feature component (Standalone, OnPush)
| name | angular-routing |
| description | Generates Angular routing configurations and navigation patterns |
This skill helps you generate Angular routing configurations, lazy loading, route guards, and navigation patterns following best practices.
import { Routes } from '@angular/router';
import { EditorComponent } from './features/editor/editor.component';
import { AuthGuard } from './core/guards/auth.guard';
export const routes: Routes = [
{
path: '',
redirectTo: '/editor',
pathMatch: 'full',
},
{
path: 'editor',
component: EditorComponent,
data: { title: 'Program Editor' },
},
{
path: 'admin',
loadChildren: () => import('./features/admin/admin.routes').then((m) => m.adminRoutes),
canLoad: [AuthGuard],
data: { preload: false },
},
{
path: 'settings',
loadComponent: () =>
import('./features/settings/settings.component').then((m) => m.SettingsComponent),
},
{
path: '**',
loadComponent: () =>
import('./shared/components/not-found/not-found.component').then((m) => m.NotFoundComponent),
},
];
import { Routes } from '@angular/router';
export const adminRoutes: Routes = [
{
path: '',
loadComponent: () => import('./admin.component').then((m) => m.AdminComponent),
children: [
{
path: 'dashboard',
loadComponent: () =>
import('./dashboard/dashboard.component').then((m) => m.AdminDashboardComponent),
},
{
path: 'users',
loadComponent: () => import('./users/users.component').then((m) => m.AdminUsersComponent),
},
{
path: '',
redirectTo: 'dashboard',
pathMatch: 'full',
},
],
},
];
import { Routes } from '@angular/router';
export const routes: Routes = [
{
path: 'admin',
loadChildren: () => import('./admin/admin.routes').then((m) => m.adminRoutes),
canLoad: [AuthGuard],
data: { preload: false },
},
{
path: 'dashboard',
loadComponent: () =>
import('./dashboard/dashboard.component').then((m) => m.DashboardComponent),
},
{
path: 'users',
loadChildren: () => import('./users/users.routes').then((m) => m.usersRoutes),
},
];
// Separate route file (admin.routes.ts)
export const adminRoutes: Routes = [
{
path: '',
component: AdminComponent,
children: [
{
path: 'users',
component: AdminUsersComponent,
},
{
path: 'settings',
component: AdminSettingsComponent,
},
],
},
];
import { Routes } from '@angular/router';
import { AuthGuard } from './guards/auth.guard';
import { RoleGuard } from './guards/role.guard';
export const routes: Routes = [
{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard, RoleGuard],
canActivateChild: [AuthGuard],
data: { roles: ['admin'] },
children: [
{
path: 'users',
component: UsersComponent,
canDeactivate: [UnsavedChangesGuard],
},
],
},
{
path: 'profile',
component: ProfileComponent,
canActivate: [AuthGuard],
},
];
import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';
@Injectable({
providedIn: 'root',
})
export class NavigationService {
constructor(private router: Router) {
// Listen to navigation events
this.router.events
.pipe(filter((event) => event instanceof NavigationEnd))
.subscribe((event: NavigationEnd) => {
console.log('Navigation to:', event.url);
});
}
navigateToUser(userId: string): void {
this.router.navigate(['/users', userId]);
}
navigateWithQueryParams(): void {
this.router.navigate(['/search'], {
queryParams: { q: 'angular', page: 1 },
queryParamsHandling: 'merge',
});
}
goBack(): void {
this.router.navigate(['../']);
}
getCurrentRoute(): string {
return this.router.url;
}
}
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { UserService } from './user.service';
import { User } from './user.model';
@Injectable({
providedIn: 'root',
})
export class UserResolver implements Resolve<User> {
constructor(private userService: UserService) {}
resolve(route: ActivatedRouteSnapshot): Observable<User> {
const userId = route.paramMap.get('id');
return this.userService.getUser(userId!);
}
}
// Usage in routes
export const routes: Routes = [
{
path: 'users/:id',
component: UserDetailComponent,
resolve: {
user: UserResolver,
},
},
];
// Usage in component
export class UserDetailComponent {
user: User;
constructor(private route: ActivatedRouteSnapshot) {
this.user = this.route.data['user'];
}
}
import { Injectable } from '@angular/core';
import { PreloadingStrategy, Route } from '@angular/router';
import { Observable, of } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class CustomPreloadingStrategy implements PreloadingStrategy {
preload(route: Route, load: () => Observable<any>): Observable<any> {
// Preload based on data property
if (route.data && route.data['preload']) {
return load();
}
// Preload admin routes
if (route.path === 'admin') {
return load();
}
return of(null);
}
}
// Usage in app.config.ts
import { provideRouter, withPreloading } from '@angular/router';
export const appConfig: ApplicationConfig = {
providers: [provideRouter(routes, withPreloading(CustomPreloadingStrategy))],
};
import { Component } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user-detail',
template: `
<div>
<h2>User Detail</h2>
<p>User ID: {{ userId }}</p>
<p>Query Param: {{ searchQuery }}</p>
<button (click)="goToEdit()">Edit User</button>
<button (click)="goBack()">Back</button>
</div>
`,
})
export class UserDetailComponent {
userId: string;
searchQuery: string;
constructor(
private router: Router,
private route: ActivatedRoute,
) {
// Get route parameters
this.route.paramMap.subscribe((params) => {
this.userId = params.get('id')!;
});
// Get query parameters
this.route.queryParamMap.subscribe((params) => {
this.searchQuery = params.get('q')!;
});
}
goToEdit(): void {
this.router.navigate(['edit'], { relativeTo: this.route });
}
goBack(): void {
this.router.navigate(['../'], { relativeTo: this.route });
}
}
import { trigger, transition, style, animate, query, group } from '@angular/animations';
export const routeAnimations = trigger('routeAnimations', [
transition('* <=> *', [
query(':enter, :leave', [
style({
position: 'absolute',
width: '100%'
})
], { optional: true }),
group([
query(':leave', [
animate('300ms ease-out', style({ opacity: 0, transform: 'translateX(-100%)' }))
], { optional: true }),
query(':enter', [
style({ opacity: 0, transform: 'translateX(100%)' }),
animate('300ms ease-out', style({ opacity: 1, transform: 'translateX(0%)' }))
], { optional: true })
])
])
]);
// Usage in app.component.html
<div [@routeAnimations]="getRouteAnimationState(outlet)">
<router-outlet #outlet="outlet"></router-outlet>
</div>