【问题标题】:Mat slide toggle true / false update in Firestore在 Firestore 中的 Mat 幻灯片切换真/假更新
【发布时间】:2018-10-10 01:31:27
【问题描述】:

我正在尝试将 Firestore 文档的布尔字段从true 更新为false 或从false 更新为true,视情况而定。

当我激活和停用按钮时,它似乎工作正常,但在某些情况下它停止工作,我必须再次按下按钮。

这里是我的堆栈闪电战:https://stackblitz.com/edit/angular-ea3wme

myComponent.html

<mat-slide-toggle #toggle [checked]="domiciliario.estado" (change)="actualizarEstado(domiciliario.id)"></mat-slide-toggle>

myComponent.ts

actualizarEstado(key){
this.fs.updateEstado(key);
}

myService.ts

estadoChange: boolean = !false || !true;

updateEstado(key){
this.afs.doc('domiciliarios/' + key).update({
  estado : this.estadoChange = !this.estadoChange
})
}

【问题讨论】:

  • 在您的服务中,您在所有domiciliarios 中使用相同的estadoChange 值。您需要切换正在由切换器编辑的特定domiciliarioestado 属性。

标签: angular typescript angular-material google-cloud-firestore


【解决方案1】:

原因是您的服务的estadoChange 不会与您编辑的domiciliario 项目保持同步。如果您希望domiciliarios 的所有项目保持estado 的独立状态,则需要将它们中的每一个更新为它们自己的确切对应状态,这意味着您应该利用mat-slide-toggle 的值。

您可以尝试使用ngModelngModelChange

<mat-slide-toggle #toggle [ngModel]="domiciliario.estado" (ngModelChange)="actualizarEstado(domiciliario.id, $event)"></mat-slide-toggle>

// component function
actualizarEstado(key, obj, e){
  this.fs.updateEstado(key, e);
}

// service function
updateEstado(key, estado){
  this.afs.doc('domiciliarios/' + key).update({estado});
}

参考固定demo


其他信息: 每次更改项目都会导致firebase的值发生变化,并导致重新渲染所有ngFor项目,您应该考虑使用trackBy来防止重新渲染它的相同项目,另见docs solution for ngFor performance question

【讨论】:

  • 感谢您纠正方法,这对我有用。一个额外的细节,当我在app.module.ts 中包含BrowserAnimationsModule 时,当我单击mat-slide-toggle 时会出现轻微闪烁:stackblitz.com/edit/angular-hr7suh 如果您对如何更正它有任何参考,我将不胜感激。
  • @PacoZevallos 这是因为您正在重新渲染所有项目。您可以添加一个trackBy 函数来告诉 Angular 始终停止重新渲染同一个项目。请参阅我的 anwser 中的固定演示以及 stackoverflow.com/questions/46249811/…
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2022-12-17
  • 2012-02-09
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多