角度反应复选框仅在首次单击后才能正确切换

时间:2017-07-17 18:26:22

标签: angular checkbox angular-reactive-forms

我有一个动态生成复选框的表单,以及一个从服务器获取表单数据的初始get请求(选中和取消选中复选框,其值由0或1定义为true或false) 当我单击一个复选框时,它应该切换(选中/取消选中)以及发送正确的放置请求(与当前值相反(0到1,1对0)。 现在,所有未选中的复选框都按预期运行。但是从初始get中检查的框,单击一次,然后取消选中,当它应该发送0时发送1,如果再次单击,则保持未选中但发送正确的0输出,然后该复选框从那时起正确运行。发生了什么事只是搞砸了第一次点击只有复选框?

排版

places;
    ready = false;
    countriesForm: FormGroup;

constructor(private whiteListService: WhiteListService) {}

ngOnInit() {
    // get places list with status'
    this.whiteListService.getList()
        .subscribe(
            (response: Response) => {
                console.log(response.statusText);
                this.places = response.json();
                this.createList(this.places.countries);
            },
            (error) => console.log(error)
        );
}

createList(places) {
    // assign this.places for dom binding access
    this.places = places;
    console.log(places)
    this.countriesForm = new FormGroup({});
    for (let i = 0; i < this.places.length; i++) {
        this.countriesForm.addControl(
            this.places[i].name, new FormControl()
        );
    }
    this.ready = true;
}

toggleAllowed(place, event) {
    // send authorization of country to server
    console.log('allow before switch', place.allow);
    place.allow === 1 ? place.allow = 0 : place.allow = 1;
    console.log('allow after switch', place.allow);
    console.log(this.places);
    this.whiteListService.sendAllow(place.code, place.allow)
        .subscribe(
            (response) => console.log(response),
            (error) => {
                console.log(error);
                place.allow = !place.allow;
            }
        );
}

}

HTML

<div class="geo-list">
    <div class="content-box container">
         <form *ngIf="ready" [formGroup]="countriesForm">
            <div class="place" *ngFor="let place of places">
                <input
                    type="checkbox"
                    formControlName="{{place.name}}"
                    value="{{place.allow}}"
                    (change)="toggleAllowed(place, $event)"
                    [checked]="place.allow == 1"
                >
                {{ place.name }} | {{ place.code }} | {{ place.continent }} | {{ place.allow }}
            </div>
        </form>
    </div>
</div>

2 个答案:

答案 0 :(得分:1)

您需要将值设置为表单控件,因为就像现在一样,无论是否选中该框,表单控件的值最初都为null

我们可以通过迭代解决此问题,您可以根据数值将值设置为truefalse

for (let i = 0; i < this.places.length; i++) {
  this.countriesForm.addControl(
     this.places[i].name, new FormControl(this.places[i].allow == 1 ? true : false)
  );
}

然后你可以摆脱模板中的checked

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

作为旁注,从理论上讲,您不需要在01truefalse之间切换,如此处所述:{{3}但我坚持使用truefalse:)

答案 1 :(得分:0)

好吧,所以我解决了这个问题,通过更改toggleAllowed函数中的开关功能,使用&#39; ==&#39;而不是&#39; ===&#39;。而ts lint标记这一点,并建议&#39; ===&#39;它只是无法使用&#39; ===&#39;。不知道为什么。

此方法适用于预定义控件值,或使用[check] =&#34; place.allow&#34;来定义控件值。