angular - 处理模型中与视图相关的属性的最佳方法(从远程服务获取)
问题描述
假设我有一个接口,例如:
export interface Alert {
alertId: string,
alertMessage: string,
timestamp: Date,
alertType: number
}
例如,我在组件中显示;
app.component.ts
:
alerts : Alert[];
ngOnInit(){
this.alerts = this.getAlertsFromRemoteService();
}
getAlertsFromRemoteService() : Alert[] {
//http get request...
}
updateAlertInRemoteService(alert : Alert) {
//http post request...
}
app.component.html
:
<tbody>
<tr *ngFor="let alert in alerts">
<td>
<button (click)="updateAlertInRemoteService(alert)">
</td>
</tr>
</tbody>
现在我想在updateAlertInRemoteService
运行时更改视图(例如,将类更改tr
为disabled
)。这样做的最佳方法是什么?
是的,我当然可以将Alert
界面更改为类似的东西submitting: boolean
,但那样我就“干扰”了模型的完整性......
你会怎么做?
谢谢
解决方案
您可以将“提交”逻辑存储在单独的数组中,该数组在加载数据时初始化,并在更新数据时切换。
alerts : Alert[];
submitting: boolean[];
ngOnInit() {
this.service.getAlerts().subscribe(alerts => {
this.submitting = alerts.map(() => false);
this.alerts = alerts;
});
}
updateAlertInRemoteService(index: number) {
this.submitting[index] = true;
const alert = this.alerts[index];
// http post request...
this.service.update(alert).subscribe(() => {
this.submitting[index] = false;
});
}
然后您的 HTML 可以处理索引并绑定到提交数组。
<tbody>
<tr *ngFor="let alert of alerts; index as i"
[class.disabled]="submitting[i]">
<td>
<button (click)="updateAlertInRemoteService(i)">
</td>
</tr>
</tbody>
或者,您可以保留updateAlertInRemoteService
当前拥有的签名,并找到已提交的索引alert
。
使用视图模型
这里的另一个选择是使用视图模型。
export interface AlertViewModel {
alert: Alert;
submitting: boolean;
}
您将在组件中创建一个数组并在视图模型中管理提交状态。这有利于保持您的原始模型干净,并使您的视图问题远离您的域模型。
推荐阅读
- google-data-studio - 有没有办法将当前时间戳添加到 Google Data Studio 报告中?
- android - 在 textView 中打印一个 json 文件
- javascript - 在 Jquery 中的单击功能在计算机上使用时不起作用
- png - 将ai文件转换为png后字体失真
- elm - 如何退出 elm repl?
- android - 如何在电话信息中读取 Android IP 地址状态?
- hyperledger-fabric - Hyperledger Fabric:缺少 etcdraft 配置
- javascript - Javascript频率计数器算法
- android - 矢量绘图在 Android 应用程序中无法正确显示
- java - 如何在Android中将ArrayList的所有元素显示为芯片