为什么对象既已读又未读?
2021-03-10
77
我尝试从 DB 中获取一个对象(类型为“Coupon”),并在单击 HTML 列表中的对象时显示它。
问题是, 当页面加载时,对象详细信息按我想要的方式显示,但是!控制台还显示“ERROR TypeError:无法读取未定义的属性‘imageURL’”。
我的代码:
步骤 - 1: storage.service.ts(HTTP 请求):
@Injectable()
export class StorageService {
token: string
constructor(private http: HttpClient) { }
fetchCouponById(couponId: string): Observable<Coupon> {
const params = new HttpParams()
.set('token', this.token)
.set('couponId', couponId)
return this.http.get<Coupon>('http://localhost:8080/api/company/get_coupon', { params })
}
步骤 - 2: company.service.ts:
@Injectable()
export class CompanyService {
@Output() selectedCoupon = new EventEmitter<Coupon>()
coupon: Coupon
fetchCouponById(id: string) {
this.storagService.fetchCouponById(id)
.subscribe(coupon => {
this.coupon = coupon
this.onSelectCoupon()
})
}
onSelectCoupon() {
this.selectedCoupon.emit(this.getCoupon())
}
getCoupon() {
return this.coupon
}
步骤 - 3: company-coupons-page.ts:
export class CompanyCouponsPageComponent implements OnInit {
coupon: Coupon
selectedCoupon: string
constructor(
private companyService: CompanyService,
private route: ActivatedRoute) { }
ngOnInit(): void {
this.route.params.subscribe((params: Params) => { this.selectedCoupon = params['id'] })
this.companyService.fetchCouponById(this.selectedCoupon)
this.companyService.selectedCoupon.subscribe(
(coupon: Coupon) => { this.coupon = coupon})
}
company-coupons-page.HTML:
<div class="container">
<div class="row">
<div class="col-6"
style="height: 70%;
width: 40%;">
<img src={{coupon.imageURL}}
alt="..."
style="width: 100%;height: 100%; ">
</div>
<div class="col-6">
<h1>{{coupon.title}}</h1>
<h3>{{coupon.amount}}</h3>
<h3>{{coupon.category}}</h3>
</div>
</div>
2个回答
优惠券最初未定义,这就是您收到此类型错误的原因。您可以使用
*ngIf="coupon?.imageUrl"
(请注意使用可选链,您也可以只检查优惠券)仅在优惠券存在时呈现元素。
您还可以将其用于以下元素
<div class="container">
<div class="row">
<div class="col-6"
style="height: 70%;
width: 40%;">
<img *ngIf="coupon?.imageUrl" src={{coupon.imageURL}}
alt="..."
style="width: 100%;height: 100%; ">
</div>
<div class="col-6">
<h1 *ngIf="coupon?.title">{{coupon.title}}</h1>
<h3 *ngIf="coupon?.amount">{{coupon.amount}}</h3>
<h3 *ngIf="coupon?.category">{{coupon.category}}</h3>
</div>
</div>
Petros
2021-03-10
在为对象设置动态值之前,最好先检查该对象是否存在,以保证安全。
您可以从 HTML 或 component.ts 文件中执行此操作。
*************************
******* FROM HTML *******
*************************
<div class="row" *ngIf="coupon">
<div *ngIf="coupon.imageUrl" class="col-6" style="height: 70%; width: 40%;">
<img src={{coupon.imageURL}} alt="..." style="width: 100%;height: 100%; ">
</div>
<div class="col-6" *ngIf="coupon.title && coupon.amount && coupon.category">
<h1>{{coupon.title}}</h1>
<h3>{{coupon.amount}}</h3>
<h3>{{coupon.category}}</h3>
</div>
</div>
***************************************
******* FROM service.ts file ********
***************************************
@Injectable()
export class CompanyService {
@Output() selectedCoupon = new EventEmitter<Coupon>()
coupon: Coupon
fetchCouponById(id: string) {
this.storagService.fetchCouponById(id)
.subscribe(coupon => {
if (coupon) {
this.coupon = coupon
this.onSelectCoupon()
}
})
}
onSelectCoupon() {
this.selectedCoupon.emit(this.getCoupon())
}
getCoupon() {
return this.coupon
}
This way you will be very sure that you have the object before you assign it anywhere.
Srikar Phani Kumar M
2021-03-10