У меня есть всплывающая страница html с Angular:
<div class="example-container mat-elevation-z8">
<div class="example-loading-shade"
*ngIf="isLoadingResults">
<mat-spinner *ngIf="isLoadingResults"></mat-spinner>
</div>
<div class="button-row">
<a mat-flat-button color="primary" [routerLink]="['/products']"><mat-icon>list</mat-icon></a>
</div>
<mat-card class="example-card">
<mat-card-header>
<mat-card-title><h2>{{product.prod_name}}</h2></mat-card-title>
<mat-card-subtitle>{{product.prod_desc}}</mat-card-subtitle>
</mat-card-header>
<mat-card-content>
<dl>
<dt>Product Price:</dt>
<dd>{{product.prod_price}}</dd>
<dt>Updated At:</dt>
<dd>{{product.updated_at | date}}</dd>
</dl>
</mat-card-content>
<mat-card-actions>
<a mat-flat-button color="primary" (click)="editProduct()"><mat-icon>edit</mat-icon></a>
<a mat-flat-button color="warn" (click)="deleteProduct(product.id)"><mat-icon>delete</mat-icon></a>
</mat-card-actions>
</mat-card>
</div>
и соответствующим классом компонента:
import {Component, OnDestroy, OnInit} from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router';
import {ApiService} from '../api.service';
import {Product} from '../product';
import {ViewProductService} from '../view-product.service';
import {Subscription} from 'rxjs/internal/Subscription';
@Component({
selector: 'app-product-detail',
templateUrl: './product-detail.component.html',
styleUrls: ['./product-detail.component.sass']
})
export class ProductDetailComponent implements OnInit, OnDestroy {
product = {} as Product;
product2 = {} as Product;
subscription: Subscription;
isLoadingResults = true;
constructor(private route: ActivatedRoute, private api: ApiService, private router: Router, private viewProductService: ViewProductService) {
}
ngOnInit(): void {
this.subscription = this.viewProductService.getCurrentProduct().subscribe(value => {
this.product.id = String(value['_id']);
this.product.prod_name = value.prod_name;
this.product.prod_desc = value.prod_desc;
this.product.prod_price = value.prod_price;
});
this.isLoadingResults = false;
// this.getProductDetails(this.route.snapshot.params['id']);
}
getProductDetails(id) {
this.api.getProduct(id)
.subscribe(data => {
this.product = data;
this.product.id = id;
console.log(this.product);
this.isLoadingResults = false;
});
}
editProduct() {
this.viewProductService.viewProduct(this.product);
this.router.navigate(['/product-edit']);
}
deleteProduct(id) {
this.isLoadingResults = true;
this.api.deleteProduct(id)
.subscribe(res => {
this.isLoadingResults = false;
this.router.navigate(['/products']);
}, (err) => {
console.log(err);
this.isLoadingResults = false;
}
);
}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}
}
Я новичок в Angular, и это Может быть, это будет новинка ie. Моя проблема в том, что когда вызывается событие onclick, метод ngOnInit
всегда вызывается раньше, чем метод editProduct
.
Это правильно? Это неожиданное поведение для меня. Мне не нужно снова вызывать метод ngOnInit
, потому что он снова отображает страницу, и мне это не нужно.
Существует способ, которым ngOnInit не будет вызываться каждый раз, когда вызывается метод editProduct?