使用反应形式实时获取复选框值 Angular

get checkbox values in real time with a reactive form Angular

我有一个国家/地区对象列表,我可以通过我的反应形式访问和使用这些对象。我将每个动态创建为表单控件,因为此列表会发生变化。然后,当复选框被单击时,我尝试使用 ngOnChanges 挂钩实时获取表单和值(不使用提交按钮)。这显然是行不通的,我应该使用什么钩子?另一方面,这是实现此目标的糟糕方法吗?什么是更好的方法?

组件

export class GeoDropComponent implements OnInit, OnChanges {
    countries = [
        {
            name : 'USA',
            continent : 'north america'
        },
        {
            name : 'Canada',
            continent: 'north america'
        }
    ];

    countriesForm: FormGroup;

    constructor() { }

    ngOnInit() {
        // add checkbox for each country
        this.countriesForm = new FormGroup({});
        for (let i = 0; i < this.countries.length; i++) {
            this.countriesForm.addControl(
                this.countries[i].name, new FormControl(false)
            )
        }
    }

    ngOnChanges() {
        console.log(this.countriesForm);
    }

}

html

<div class="geo-list">
    <div class="content-box container">
        <form [formGroup]="countriesForm">
            <div class="country" *ngFor="let country of countries">
                <input
                    type="checkbox"
                    formControlName="{{country.name}}"
                >
                {{ country.name }} | {{ country.continent }}
            </div>
        </form>
    </div>
</div>

你可以这样试试。 when ever search checkbox is selected or selected change method will update selected items

伪代码

 <input
            type="checkbox"
             formControlName="{{country.name}}"
             (change)="search(country, $event)
                    >

组件文件。

selectedItems : any [] = [];

    search(country, event) {

            var index = this.selectedItems.indexOf(country.name);
            if (event.target.checked) {
                if (index === -1) {
                    this.selectedItems.push(country.name);
                }
            } else {
                if (index !== -1) {
                    this.selectedItems.splice(index, 1);
                }
            }

        }
    }