添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
飞奔的山羊  ·  OC Swift ...·  1 年前    · 
帅呆的炒粉  ·  nodejs+libreoffice ...·  2 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I´m fairly new to Angular2 and I have a little problem:

In my Login-Component-HTML, I have two checkboxes, which I want to bind in two way data-binding to the Login-Component-TypeScript.

This is the HTML:

<div class="checkbox">
<label>
    <input #saveUsername [(ngModel)]="saveUsername.selected" type="checkbox" data-toggle="toggle">Save username
</label>

And this is the Component.ts:

import { Component, OnInit }    from '@angular/core';
import { Router }               from '@angular/router';
import { Variables }            from '../../services/variables';
@Component({
    selector: 'login',
    moduleId: module.id,
    templateUrl: 'login.component.html',
    styleUrls: ['login.component.css']
export class LoginComponent implements OnInit {
    private saveUsername: boolean = true;
    private autoLogin: boolean = true;
    constructor(private router: Router, private variables: Variables) { }
    ngOnInit() { 
        this.loginValid = false;
        // Get user name from local storage if you want to save
        if (window.localStorage.getItem("username") === null) {
           this.saveUsername = true;
           this.autoLogin = true;
           console.log(this.saveUsername, this.autoLogin);
        } else {
           console.log("init", window.localStorage.getItem("username"));
    login(username: string, password: string, saveUsername: boolean, autoLogin: boolean) {
        this.variables.setUsername(username);
        this.variables.setPassword(password);
        this.variables.setIsLoggedIn(true);
        console.log(saveUsername, autoLogin);
        //this.router.navigate(['dashboard']);

If I click an checkbox, I get the correct value in the controller (component).

But if I change the value of for example saveUsername in the component, the checkbox didn't "get" the new value.

So I can´t manipulate the checkbox from the Component (like I want to do in the ngOnInit in the component.

Thanks for your help!

You can remove .selected from saveUsername in your checkbox input since saveUsername is a boolean. Instead of [(ngModel)] use [checked]="saveUsername" (change)="saveUsername = !saveUsername"

Edit: Correct Solution:

<input
  type="checkbox"
  [checked]="saveUsername"
  (change)="saveUsername = !saveUsername"/>

Update: Like @newman noticed when ngModel is used in a form it won't work. However, you should use [ngModelOptions] attribute like (tested in Angular 7):

<input
  type="checkbox"
  [(ngModel)]="saveUsername"
  [ngModelOptions]="{standalone: true}"/> `

I also created an example at Stackblitz: https://stackblitz.com/edit/angular-abelrm

For some reasons, if the input is not inside a form, but it's part of *ngFor loop, [(ngModel)]="saveUsername" doesn't work, but this one works. It must be a bug in angular? – newman Feb 4, 2018 at 20:31 This works for me while [(ngModel)] is behaving weirdly. Can someone point me to some documentation or a discussion on why [checked] is better to use than ngModel in the case of checkboxes? – vc669 Apr 9, 2018 at 9:13 Although this is the accepted answer, it doesn't work in some contexts unless there is a 'name' attribute. Apparently any name. – Adam Wise Mar 1, 2019 at 20:10 when ngModel is used in a form it won't work. [ngModelOptions]="{standalone: true}" is what I needed. – rainversion_3 Apr 1, 2019 at 15:11

Unfortunately solution provided by @hakani is not two-way binding. It just handles One-way changing model from UI/FrontEnd part.

Instead the simple:

<input [(ngModel)]="checkboxFlag" type="checkbox"/>

will do two-way binding for checkbox.

Afterwards, when Model checkboxFlag is changed from Backend or UI part - voila, checkboxFlag stores actual checkbox state.

To be sure I've prepared Plunker code to present the result : https://plnkr.co/edit/OdEAPWRoqaj0T6Yp0Mfk

Just to complete this answer you should include the import { FormsModule } from '@angular/forms' into app.module.ts and add to imports array i.e

import { FormsModule } from '@angular/forms';
[...]
@NgModule({
  imports: [
    [...]
    FormsModule
  [...]
                Doesn't seem to work when you are using the checkbox inside an ngFor, while repeating an array of objects like [{"checked":true},{"checked":false}]
– Rohit Rane
                Jun 28, 2017 at 9:21
                I can't get this solution to work, I get cUncaught Error: Template parse errors: Can't bind to 'ngModel' since it isn't a known property of 'input'
– sebnukem
                Jul 10, 2017 at 22:14
                If used inside an *ngFor the name attribute has to be unique for each item in the loop. I was having issues with the default checked state because of this, once I made the name attribute unique, the default checked state was working as expected.
– Jay Klehr
                Jun 30, 2020 at 20:53
    type="checkbox" 
    [checked]="saveUsername" 
    (change)="onSaveUsernameChanged(saveUserNameCheckBox.checked)" />

component.ts

public saveUsername:boolean;
public onSaveUsernameChanged(value:boolean){
    this.saveUsername = value;

I'm working with Angular5 and I had to add the "name" attribute to get the binding to work... The "id" is not required for binding.

<input type="checkbox" id="rememberMe" name="rememberMe" [(ngModel)]="rememberMe">
                This answer worked for me. Other answers are also correct. But with [(ngModel)] we don't have to write a separate function to switch the boolean
– Jasmeet
                Nov 8, 2018 at 17:42

.html file

<input [(ngModel)]="userConsent" id="userConsent" required type="checkbox"/> " I Accept"

.ts file

userConsent: boolean = false;
  • import FormsModule in your module
  • Put the input inside a form tag
  • your input should be like this:

    <input name="mpf" type="checkbox" [(ngModel)]="value" />
    

    Note: do not forget to put name in your input.

  • this._model = checked; this.checked.emit(this._model); console.log('@Input(setmodel'+checked); get model() { return this._model;

    strange thing is this works

    <mycheckbox  [checked]="isChecked" (checked)="isChecked = $event">
    

    while this wont

    <mycheckbox  [(checked)]="isChecked">
    
    <div class="checkbox">
      <label>
        <input name="selected" [(ngModel)]="saveUsername.selected" type="checkbox">Save username
      </label>
    

    I know it may be repeated answer but for any one want to load list of checkboxes with selectall checkbox into angular form i follow this example: Select all/deselect all checkbox using angular 2+

    it work fine but just need to add

    [ngModelOptions]="{standalone: true}" 
    

    the final HTML should be like this:

    <li><input type="checkbox" [(ngModel)]="selectedAll" (change)="selectAll();"/></li> <li *ngFor="let n of names"> <input type="checkbox" [(ngModel)]="n.selected" (change)="checkIfAllSelected();">{{n.name}}

    TypeScript

      selectAll() {
        for (var i = 0; i < this.names.length; i++) {
          this.names[i].selected = this.selectedAll;
      checkIfAllSelected() {
        this.selectedAll = this.names.every(function(item:any) {
            return item.selected == true;
    

    hope this help

    In any situation, if you have to bind a value with a checkbox which is not boolean then you can try the below options

    In the Html file:

    <div class="checkbox">
    <label for="favorite-animal">Without boolean Value</label>
    <input type="checkbox" value="" [checked]="ischeckedWithOutBoolean == 'Y'" 
    (change)="ischeckedWithOutBoolean = $event.target.checked ? 'Y': 'N'">
    

    in the componentischeckedWithOutBoolean: any = 'Y';

    See in the stackblitz https://stackblitz.com/edit/angular-5szclb?embed=1&file=src/app/app.component.html

    @Input() trueValue:any; @Input() falseValue:any; @Output() checkModelChange = new EventEmitter<any>(); constructor(private el: ElementRef) { } ngOnInit() { this.el.nativeElement.checked = this.checkModel==this.trueValue; @HostListener('change', ['$event']) onChange(event:any) { this.checkModel = event.target.checked ? this.trueValue : this.falseValue; this.checkModelChange.emit(this.checkModel);
    <input type="checkbox" [(checkModel)]="check" [trueValue]="1" [falseValue]="0">
                    Hi, please explain your problem, what have you tried and add some context to your question
    – TOPKAT
                    Aug 28, 2019 at 19:43
    
    <p-checkbox name="checkbox" value="isAC" 
        label="All Colors" [(ngModel)]="selectedAllColors" 
        [ngModelOptions]="{standalone: true}" id="al" 
        binary="true">
    </p-checkbox>
    

    And more importantly, don't forget to include [ngModelOptions]="{standalone: true} as well as it SAVED MY DAY.

    A workaround to achieve the same specially if you want to use checkbox with for loop is to store the state of the checkbox inside an array and change it based on the index of the *ngFor loop. This way you can change the state of the checkbox in your component.

    app.component.html

    <div *ngFor="let item of items; index as i"> <input type="checkbox" [checked]="category[i]" (change)="checkChange(i)"> {{item.name}}

    app.component.ts

    items = [
        {'name':'salad'},
        {'name':'juice'},
        {'name':'dessert'},
        {'name':'combo'}
      category= []
      checkChange(i){
        if (this.category[i]){  
          this.category[i] = !this.category[i];
        else{
          this.category[i] = true;
            

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.