javascript - Angular 2 - 通过引用传递对象字段。可重复使用的方式来编辑对象

标签 javascript angular object angular2-directives

我正在创建可重用的表格组件,它将允许编辑对象字段以准备将它们发送到 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/

相关文章:

javascript - Node "require"语法创建模块的新引用

javascript - 何时从浏览器关闭与 SignalR 的连接

javascript - 在输入内部键入内容时忽略按键

javascript - 什么是 JS 正则表达式来匹配文本中的 sha256 单词哈希?

php - 为什么不调用父构造函数?

vba - 在 VBA 中链接类

java - 属性: @property for Java

Angular 6无法读取未定义的属性 'userEmail'

Angular Animation 在 IE11 和 Firefox 中不转换(在 Chrome 中工作)

angular - 在生产构建中包含库许可证 - Angular