【问题标题】:input and output for the same variable同一个变量的输入和输出
【发布时间】:2018-07-23 11:59:05
【问题描述】:

我有一个可以从父级和子级编辑的变量。

父.html:

 <div *ngIf="editEnabled">
  <mat-icon (click)="disableEdit()">cancel</mat-icon>
</div>

<child [(editEnabled)]="editEnabled"></child>

父.ts:

export class ParentComponent {

   editEnabled: boolean;

   disableEdit(){
     this.editEnabled = false;
   }
}

Child.html:

 <div *ngIf="!editEnabled">
  <mat-icon (click)="enableEdit()">settings</mat-icon>
</div>

child.ts

private _editEnabled: boolean;

@Input()
 set editEnabled(value: boolean) {
  this._editEnabled = value;

}
get editEnabled(): boolean {
 return this._editEnabled;
}

enableEdit(){
     this.editEnabled = true;
}

但我无法在两个组件之间通信 editEnabled。

我的错误在哪里?

【问题讨论】:

标签: angular angular5 getter-setter


【解决方案1】:

定义双绑定变量时,需要定义一个带有变量名的@Input-decorator:

@Input() editEnabled: boolean;

还有一个带有变量名的@Output-decorator 和Change,因为这个会发出变量的变化事件:

@Output() editEnabledChange: EventEmitter<boolean> = new EventEmitter<boolean>();

然后在更改子组件内的变量时,调用this.editEnabledChange.emit(true)。您与[(...)] 的双重绑定是正确的!

【讨论】:

  • 这种模式对我来说很奇怪。如果我们需要将一个组件向上爬到祖父级怎么办?我们会有 editEnabledChangeChange 吗?
  • 不,你仍然有双重绑定的“editEnabled”。
  • 感谢您的回答。我很想看到一个事件爬上几个组件的例子,我需要对此进行调查。
【解决方案2】:

如果您不想在每次更改变量correct 时添加editEnabledChange-Emitter,您可以编写:

_correct: boolean;
@Input()
set correct(val: boolean) {
  this.correctChange.emit(val);
  this._correct = val;
}
get correct() {
  return this._correct;
}
@Output()
correctChange: EventEmitter<boolean> = new EventEmitter<boolean>();
&lt;app-pin [(correct)]="isPinCorrect"&gt;&lt;/app-pin&gt;

【讨论】:

  • 您或其他人能否创建一个新的注释来实现这一点,这样我们就可以编写 @InputOutput() 正确:布尔值; ???
  • 不,Angular 中没有直接的方法来声明和使用组件中的输入/输出字段
最近更新 更多