【发布时间】:2021-06-20 14:16:59
【问题描述】:
组件有一个来自其父级的输入,并且有一个针对该输入对象的输出事件。 NgStyle 从组件中获取样式对象进行样式设置。点击事件改变了布尔值,但样式对象没有相应更新,因此颜色保持不变。我必须重新分配一个新对象才能让 NgStyle 看到新的布尔值。我做错了什么?
ProductItemComponent.ts:
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import {Product} from '../../model/product';
@Component({
selector: 'app-product-item',
templateUrl: './product-item.component.html',
styleUrls: ['./product-item.component.css']
})
export class ProductItemComponent implements OnInit {
@Input() public product!:Product;
@Output() private updateStatus: EventEmitter<Product>;
public statusTextStyle:object;
public classStyle:object;
constructor() {
this.updateStatus = new EventEmitter<Product>();
}
ngOnInit(): void {
this.statusTextStyle = {
// if true color green, if false red
"color" : this.product.getStatus() ? "var(--ok)" : "var(--danger)"
}
}
onUpdateStatus(event){
this.updateStatus.emit(this.product);
// have to reassign a new object to change style
this.statusTextStyle = {
"color" : this.product.getStatus() ? "var(--ok)" : "var(--danger)"
}
console.log(this.statusTextStyle);
}
}
产品-item.component.html:
<div class="productContainer">
<div class="overlay">
<div [ngStyle]="statusTextStyle">{{product.name}}</div>
<hr>
<div>Status: {{product.getStatus()}}</div>
<div>Price: {{product.price}}</div>
<br>
<div>Code: {{product.code}}</div>
<br>
<div>Stock: {{product.quantity}}</div>
<hr>
<button (click)="onUpdateStatus($event)">UPDATE STATUS</button>
</div>
</div>
家长:
import { Component, OnInit } from '@angular/core';
import { Product as ProductModel} from '../../model/product';
@Component({
selector: 'app-product-list',
templateUrl: './product-list.component.html',
styleUrls: ['./product-list.component.css']
})
export class ProductListComponent implements OnInit {
products: Array<ProductModel>;
constructor() { }
ngOnInit(): void {
this.products = [
new ProductModel('A','1',3,40),
new ProductModel('B','2',4,50),
new ProductModel('C','3',22,41),
new ProductModel('E','4',342,433),
new ProductModel('Z','5',33,477)
]
}
onUpdateStatus(product:ProductModel){
product.setStatus(!product.getStatus());
console.log(product.getStatus());
}
}
父 html:
<div class="productList">
<div *ngFor="let product of products; let index as i;">
<app-product-item [product]="product" (updateStatus)="onUpdateStatus($event)"></app-product-item>
</div>
产品型号:
export class Product {
private _status:boolean = false;
constructor(public name:string,
public code:string,
public price:number,
public quantity:number){}
public getStatus():boolean{
return this._status;
}
public setStatus(status:boolean):void{
this._status = status;
}
}
如果this.statusTextStyle 没有重新分配一个新对象(回想一下getStatus()),NgStyle 使用在ngOnInit 中设置的样式
【问题讨论】:
-
您能提供您的
ngStyle代码吗?我猜你的问题是你应该分配this.statusTextStyle.color = this.product.getStatus() ? "var(--ok)" : "var(--danger)"。然后你可能需要调用ChangeDetectorRef(注入)changeDetectorRef.detectChanges()。由于性能原因,我不推荐这种方法,如果您可以提供更多代码,也许我可以考虑别的。 :) -
为什么你期望
product.getStatus()在这段代码中似乎没有改变产品对象的任何东西时返回不同的东西?您似乎还缺少基于该错误消息的CommonModule导入?在询问有关ngStyle用法的问题时,您的ngStyle绑定也会很有用。 -
@JorgeMussato 我将
this.statusTextStyle初始化为ngOnInit中的一个新对象。如果我像this.statusTextStyle.color一样分配错误投诉:“对象”类型上不存在属性颜色。 -
@bryan60 我最近刚接触到 Angular,我跟着书
Angular Up and Running。如果我理解正确,组件中的event emitter将触发其父级的此输出事件。正如我在 console.log 中显示的那样,该值确实发生了变化 -
你可以创建一个最小的 stackblitz 演示
标签: angular typescript