Routing and Lazy Loading

This commit is contained in:
Charles Showalter 2022-05-13 15:33:15 -07:00
parent bb8ea8cfae
commit 60c60b24fe
17 changed files with 145 additions and 19 deletions

View File

@ -1,7 +1,15 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { ProductDetailsComponent } from './shop/product-details/product-details.component';
import { ShopComponent } from './shop/shop.component';
const routes: Routes = [
{path: '', component: HomeComponent},
{path: 'shop', loadChildren: ()=> import('./shop/shop.module').then(mod => mod.ShopModule)},
{path: '**', redirectTo: '', pathMatch: 'full'}
];
const routes: Routes = [];
@NgModule({ @NgModule({
imports: [RouterModule.forRoot(routes)], imports: [RouterModule.forRoot(routes)],

View File

@ -1,4 +1,4 @@
<app-nav-bar></app-nav-bar> <app-nav-bar></app-nav-bar>
<div class="container" style="margin-top: 140px;"> <div class="container" style="margin-top: 140px;">
<app-shop></app-shop> <router-outlet></router-outlet>
</div> </div>

View File

@ -7,6 +7,7 @@ import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { CoreModule } from './core/core.module'; import { CoreModule } from './core/core.module';
import { ShopModule } from './shop/shop.module'; import { ShopModule } from './shop/shop.module';
import { HomeModule } from './home/home.module';
@NgModule({ @NgModule({
declarations: [ declarations: [
@ -18,7 +19,7 @@ import { ShopModule } from './shop/shop.module';
BrowserAnimationsModule, BrowserAnimationsModule,
HttpClientModule, HttpClientModule,
CoreModule, CoreModule,
ShopModule HomeModule
], ],
providers: [], providers: [],
bootstrap: [AppComponent] bootstrap: [AppComponent]

View File

@ -1,13 +1,15 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NavBarComponent } from './nav-bar/nav-bar.component'; import { NavBarComponent } from './nav-bar/nav-bar.component';
import { RouterModule } from '@angular/router';
@NgModule({ @NgModule({
declarations: [NavBarComponent], declarations: [NavBarComponent],
imports: [ imports: [
CommonModule CommonModule,
RouterModule
], ],
exports: [NavBarComponent] exports: [NavBarComponent]
}) })

View File

@ -1,9 +1,9 @@
<div class="d-flex flex-column flex-md-row align-items-center justify-content-between p-3 px-md-4 mb-3 bg-white border-bottom shadown-sm fixed-top"> <div class="d-flex flex-column flex-md-row align-items-center justify-content-between p-3 px-md-4 mb-3 bg-white border-bottom shadown-sm fixed-top">
<img src="/assets/images/logo.png" style="max-height: 70px;" alt="logo"> <img class="logo" src="/assets/images/logo.png" style="max-height: 70px;" alt="logo" routerLink="/">
<nav class="me-3 my-md-0 mr-md-3 text-uppercase" style="font-size: larger;"> <nav class="me-3 my-md-0 mr-md-3 text-uppercase" style="font-size: larger;">
<a class="me-3 py-2 text-dark" href="#">Home</a> <a class="me-3 py-2" [routerLink]="['/']" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">Home</a>
<a class="me-3 py-2 text-dark" href="#">Shop</a> <a class="me-3 py-2" routerLink="/shop" routerLinkActive="active">Shop</a>
<a class="me-3 py-2 text-dark" href="#">Contact</a> <a class="me-3 py-2">Contact</a>
</nav> </nav>
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<a class="position-relative"> <a class="position-relative">

View File

@ -10,3 +10,19 @@
top: -12px; top: -12px;
right: 5px; right: 5px;
} }
a {
text-decoration: none;
color: #343a40;
&.active {
color: orange;
}
}
.logo {
cursor: pointer;
&:focus{
outline: none;
}
}

View File

@ -0,0 +1 @@
<p>home works!</p>

View File

View File

@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss']
})
export class HomeComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

View File

@ -0,0 +1,16 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HomeComponent } from './home.component';
@NgModule({
declarations: [
HomeComponent
],
imports: [
CommonModule
],
exports: [HomeComponent]
})
export class HomeModule { }

View File

@ -0,0 +1,22 @@
<div class="row" *ngIf="product">
<div class="col-6">
<img src="{{product.pictureUrl}}" alt="{{product.name}}" class="img-fluid w-100">
</div>
<div class="col-6">
<h3>{{product.name}}</h3>
<p>{{product.price | currency}}</p>
<div class="d-flex justify-content-start align-items-center">
<i class="fa fa-minus-circle text-warning me-2" style="cursor: pointer; font-size: 2em"></i>
<span class="font-weight-bold" style="font-size: 1.5em;">2</span>
<i class="fa fa-plus-circle text-warning mx-2" style="cursor: pointer; font-size: 2em"></i>
<button class="btn btn-outline-secondary btn-lg ms-4">Ad to Cart</button>
</div>
</div>
<div class="row mt-5">
<div class="col-12 ms-3">
<h4>Description</h4>
<p>{{product.description}}</p>
</div>
</div>
</div>

View File

@ -0,0 +1,30 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { IProduct } from 'src/app/shared/models/product';
import { ShopService } from '../shop.service';
@Component({
selector: 'app-product-details',
templateUrl: './product-details.component.html',
styleUrls: ['./product-details.component.scss']
})
export class ProductDetailsComponent implements OnInit {
product: IProduct;
constructor(private shopService: ShopService, private activatedRoute: ActivatedRoute) { }
ngOnInit(): void {
this.loadProduct();
}
loadProduct(){
this.shopService.getProduct(+this.activatedRoute.snapshot.paramMap.get('id')).subscribe(
{
next: (product) => { this.product = product; },
error: (e: any) => { console.log(e); },
complete: () => { console.log('complete'); }
}
);
}
}

View File

@ -1,13 +1,13 @@
<div class="card h-100 shadow-sm"> <div class="card h-100 shadow-sm">
<img src="{{product.pictureUrl}}" alt="{{product.name}}" class="img-fluid bg-light"> <img src="{{product.pictureUrl}}" alt="{{product.name}}" class="img-fluid bg-light">
<div class="card-body d-flex flex-column"> <div class="card-body d-flex flex-column">
<a href=""> <a routerLink="/shop/{{product.id}}">
<h6 class="text-uppercase">{{product.name}}</h6> <h6 class="text-uppercase">{{product.name}}</h6>
</a> </a>
<span class="mb-2">{{product.price | currency}}</span> <span class="mb-2">{{product.price | currency}}</span>
<div class="btn-group mt-auto"> <div class="btn-group mt-auto">
<button type="button" class="btn btn-sm btn-outline-secondary fa fa-shopping-cart me-2"></button> <button type="button" class="btn btn-sm btn-outline-secondary fa fa-shopping-cart me-2"></button>
<button type="button" class="btn btn-sm btn-outline-secondary">View</button> <button routerLink="/shop/{{product.id}}" type="button" class="btn btn-sm btn-outline-secondary">View</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,12 +1,19 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';
import { ShopComponent } from './shop.component';
import { ProductDetailsComponent } from './product-details/product-details.component';
const routes: Routes = [
{path: '', component: ShopComponent},
{path: ':id', component: ProductDetailsComponent},
]
@NgModule({ @NgModule({
declarations: [], declarations: [],
imports: [ imports: [
CommonModule RouterModule.forChild(routes)
] ],
exports: [RouterModule]
}) })
export class ShopRoutingModule { } export class ShopRoutingModule { }

View File

@ -3,18 +3,21 @@ import { CommonModule } from '@angular/common';
import { ShopComponent } from './shop.component'; import { ShopComponent } from './shop.component';
import { ProductItemComponent } from './product-item/product-item.component'; import { ProductItemComponent } from './product-item/product-item.component';
import { SharedModule } from '../shared/shared.module'; import { SharedModule } from '../shared/shared.module';
import { ProductDetailsComponent } from './product-details/product-details.component';
import { ShopRoutingModule } from './shop-routing.module';
@NgModule({ @NgModule({
declarations: [ declarations: [
ShopComponent, ShopComponent,
ProductItemComponent ProductItemComponent,
ProductDetailsComponent
], ],
imports: [ imports: [
CommonModule, CommonModule,
SharedModule SharedModule,
], ShopRoutingModule
exports: [ShopComponent] ]
}) })
export class ShopModule { } export class ShopModule { }

View File

@ -5,6 +5,7 @@ import { IPagination } from '../shared/models/pagination';
import { IType } from '../shared/models/producttype'; import { IType } from '../shared/models/producttype';
import { map } from 'rxjs/operators' import { map } from 'rxjs/operators'
import { ShopParams } from '../shared/models/shopparams'; import { ShopParams } from '../shared/models/shopparams';
import { IProduct } from '../shared/models/product';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -41,6 +42,10 @@ export class ShopService {
); );
} }
getProduct(id: number){
return this.http.get<IProduct>(this.baseURL + 'products/' + id);
}
getBrands(){ getBrands(){
return this.http.get<IBrand[]>(this.baseURL + 'products/brands'); return this.http.get<IBrand[]>(this.baseURL + 'products/brands');
} }