Similar to how you can two-way bind [(ngModel)] you can two-way bind custom property on a component, for example [(value)]. To do it use appropriate Input/Output naming:

@Component({
  selector: 'super-input', 
  template: `...`,
})
export class AppComponent {
  @Input() value: string;
  @Output() valueChange = new EventEmitter<string>();
}

Then you can use it as:

<super-input [(value)]="value"></super-input>

file:app.component.ts

import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'super-input', 
  template: `
    Select the value:
    <button (click)="valueChange.emit('1')">Set to 1</button>
    <button (click)="valueChange.emit('2')">Set to 2</button>
  `,
})
export class SuperInputComponent {
  @Input() value: string;
  @Output() valueChange = new EventEmitter<string>();
}

@Component({
  selector: 'my-app',
  template: `
    <h1>{{value}}</h1>
    <super-input [(value)]="value"></super-input>
  `
})
export class AppComponent {
  value = '0';
}

file:app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent, SuperInputComponent } from './app.component';

@NgModule({
  imports: [BrowserModule],
  declarations: [AppComponent, SuperInputComponent],
  bootstrap: [AppComponent]
})
export class AppModule {}

翻译自:https://www.30secondsofcode.org/angular/s/two-way-binding-any-property