我正在创建可重用的表格组件,它将允许编辑对象字段以准备将它们发送到 API。
有一个对象:
person: {
name: "John"
job: {
type: "IT"
title: "Software Engineer"
}
}
我想将对象嵌套字段传递给组件并进行编辑。 F.e:
<edit-field [field]="person.job.title"></edit-field>
这会导致输入字段准确编辑原始对象中的标题字段。问题是 person.job.title 是一个字符串,而不是对象或数组,因此它不是通过引用传递的。
我有 2 个想法可以解决问题: 1) 将“person.job.title”作为字符串传递:
<edit-field [field]="'person.job.title'"></edit-field>
或
<edit-field field="person.job.title"></edit-field>
在组件类中用“.”分隔:
let fields = this.field.split('.');
然后执行一个 while 循环以通过引用访问该字段。
我们还可以做 2 个输入:
<edit-field-component [fieldRef]="person.job" [field]="'title'"></edit-field-component>
然后在组件内部执行 this.fieldRef[this.field]
我想知道是否有任何其他更干净的方法来实现这一目标。
最佳答案
基本上,您想要完成双向绑定(bind) - 即更改对象值:例如 person.job.title
更新您的新编辑组件,但您的编辑组件所做的更改也会得到反射(reflect)回对象值。
在 Angular 中,这意味着您必须以两种方式进行绑定(bind):
<edit-field [field]="person.job.title" (change)="person.job.title=$event"></edit-field>
您的 edit-field
组件有一个 @Output
属性,只要有人在其中输入内容,它就会发出更改后的值。 @Output 属性发出的值将在变量 $event
中,您只需将其分配回要更新的属性即可。
因此,您的 EditFieldComponent 可能类似于:
@Component({
.....
template: `
<input (input)="change.emit($event.target.value)" .... />
`
})
export class EditFieldComponent {
change = new EventEmitter();
}
上面的意思是,每当输入事件在您的输入字段上触发时,组件的 change
输出属性将发出输入字段的新值。
===========
如果您了解以上所有内容,那么 Angular 会为这个确切的场景提供一些捷径。如果组件的输出属性以特定方式命名,则可以简化双向绑定(bind)的编写方式。
因此,如果您的输入属性是 field
,并且您将输出属性命名为 fieldChange
,您可以使用一些奇特的语法来减少您必须输入的内容.
即
<edit-field [field]="person.job.title" (fieldChange)="person.job.title=$event"></edit-field>
相当于:
<edit-field [(field)]="person.job.title"></edit-field>
关于javascript - Angular 2 - 通过引用传递对象字段。可重复使用的方式来编辑对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570075/