angular - 使用 ngFor 在表单内动态设置离子输入值
问题描述
我可能已经点击了关于“类似问题”的每一个链接,但我不明白这里发生了什么。我认为我的设置中有问题,其他答案对我不起作用。
我有一个页面通过 *ngFor 显示潜在客户列表,我想将其更改为可编辑/可更新,因此我将其转换为反应形式,但“值”属性未显示任何内容。如果我将项目从 ion-input 组件中取出,它会将正确的值显示为纯 html,但它不是输入值。
例如,在 ion-card-title 中,这显示“John Doe”:{{item.payload.doc.data().name}}。但是在离子输入 formControlName="eName" 的“值”属性中,同样的东西是空白的。
我订阅了 firestore 集合,因为多人使用该页面,并且在添加新潜在客户或更改现有潜在客户时我需要实时更新。
我已经尝试过 [(ngModel)] 绑定,但是无论我做什么,它都会使每个列表项都具有相同的数据集(除非我更改了索引,例如 item.payload.doc.data().name 更改为, items[3].payload.doc.data().name 等)
列表项正在正确生成,当它不是表单时,它正在为每个项目显示正确的数据。我只是不知道如何在打开潜在客户时使这些项目值成为设置的表单值。这个想法是您只需更改表单条目,单击保存,它就会更新。
所以回顾一下,我试图让“John Doe”(以及正确的后续名称)使用这一行显示为表单值: ion-input formControlName="eName" type="text" value="item.payload .doc.data().name"
以下是代码的相关部分:
.html
<ion-card *ngFor="let item of items; let i = index;">
<ion-card-header>
<ion-card-subtitle>{{item.payload.doc.data().created.seconds * 1000 | date:'MM/dd/yy' }} </ion-card-subtitle>
<ion-row>
<ion-col>
<ion-card-title>{{item.payload.doc.data().name}} | {{item.payload.doc.data().dates}} </ion-card-title>
</ion-col>
<ion-col size="1" class="ion-text-right">
<ion-button fill="outline" (click)="expandItem(item)">View</ion-button>
</ion-col>
</ion-row>
</ion-card-header>
<ion-card-content>
<app-expandable expandHeight="300px" [expanded]="item.expanded">
<form [formGroup]="existingLeadForm" class="existingLeadForm" (ngSubmit)="doUpdateLead(item.payload.doc.id)">
<ion-grid>
<ion-row>
<ion-col size="6" size-sm>
<ion-item>
<ion-label position="stacked">Name</ion-label>
<ion-input formControlName="eName" type="text" value="item.payload.doc.data().name"></ion-input>
</ion-item>
</ion-col>
<ion-col size="6" size-sm>
<ion-item>
<ion-label position="stacked">Email</ion-label>
<ion-input formControlName="eEmail" type="email" value="item.payload.doc.data().email"></ion-input>
</ion-item>
</ion-col>
<ion-col size="6" size-sm>
<ion-item>
<ion-label position="stacked">Phone</ion-label>
<ion-input formControlName="ePhoneNumber" type="tel" value="item.payload.doc.data().phoneNumber"></ion-input>
</ion-item>
</ion-col>
</ion-row>
<ion-row>
<ion-col size="12" class="ion-text-right">
<ion-button color="primary-gradient" type="submit">
<ion-icon name="save"></ion-icon>
Update
</ion-button>
<ion-button color="dark" (click)="archiveLead(item)">
<ion-icon name="albums"></ion-icon>
Archive
</ion-button>
</ion-col>
</ion-row>
</ion-grid>
</form>
</app-expandable>
</ion-card-content>
.ts
existingLeadForm:FormGroup;
items: any = [];
subscription$: Subscription;
this.existingLeadForm = this.formBuilder.group({
eEmail: ['', Validators.compose([Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$'), Validators.required])],
eName: ['', Validators.required],
ePhoneNumber: ['', Validators.required],
})
this.subscription$ = this.firestore.collection('leads', ref => ref.where('archived','==',false).orderBy('created','asc'))
.snapshotChanges().subscribe(data => {
this.items = data
this.items.expanded = false
console.log(data)
});
“console.log(this.data)”显示:
(5) [{…}, {…}, {…}, {…}, {…}, expanded: false]
0: {type: "added", payload: {…}, expanded: false}
1: {type: "added", payload: {…}, expanded: false}
2: {type: "added", payload: {…}, expanded: false}
3: {type: "added", payload: {…}, expanded: false}
4: {type: "added", payload: {…}, expanded: false}
expanded: false
length: 5
__proto__: Array(0)
我错过了什么?请指出我正确的方向。谢谢你
解决方案
也许我错过了它,但我在您的模板中
找不到ngFor 。
一种方法是在订阅部分手动设置值。
就像是:
this.existingLeadForm.controls['email'].setValue(emailFromData)
在订阅方面,我更喜欢StateManagement。
在这种情况下, Ngxs及其令人敬畏的部分Ngxs From。
您可以将数据直接绑定到您的表单,并作为回报立即显示更改 - 两种方式。
也许你想仔细看看
推荐阅读
- javascript - 向 Gutenberg 封面块添加额外的设置字段
- java - Flutter,访问隐藏方法
- html - 如何使同一行中的所有图像根据父 div 缩放?
- terraform - 地形版本.tf
- reactjs - .toBe 不是函数
- c# - 尝试实现登录时出现 ArgumentException(ASP.NET Core 项目)
- ruby-on-rails - 在 ruby on rails 中的 simple_form 中提供无效输入时显示验证错误消息
- azure-devops - 如何在 azure 管道的自定义 task.json 输入选项中填充动态数据
- intellij-idea - IntelliJ 删除具有相同“名称”的代码
- jquery - Jquery 滚动慢锚回到标题