Kotak 2 Sudut 2 Cara Mengikat Data


203

Saya cukup baru di Angular2 dan saya punya sedikit masalah:

Di Login-Komponen-HTML saya, saya memiliki dua kotak centang, yang ingin saya ikat dalam dua cara pengikatan data ke Login-Komponen-TypeScript.

Ini adalah HTML:

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

Dan ini adalah 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']);
    }

Jika saya mengklik kotak centang, saya mendapatkan nilai yang benar di controller (komponen).

Tetapi jika saya mengubah nilai misalnya saveUsernamedalam komponen, kotak centang tidak "mendapatkan" nilai baru.

Jadi saya tidak bisa memanipulasi kotak centang dari Komponen (seperti yang ingin saya lakukan di ngOnInitdalam komponen.

Terima kasih atas bantuan Anda!


Periksa di sini untuk contoh 7 Sudut dari kotak centang mengikat freakyjolly.com/...
Code Spy

Jawaban:


353

Anda dapat menghapus .selecteddari saveUsernamedalam input kotak centang Anda karena saveUsername adalah boolean. Alih-alih [(ngModel)]digunakan[checked]="saveUsername" (change)="saveUsername = !saveUsername"

Edit: Solusi yang Benar:

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

Pembaruan: Seperti @newman perhatikan ketika ngModeldigunakan dalam bentuk itu tidak akan berfungsi. Namun, Anda harus menggunakan [ngModelOptions]atribut like (diuji dalam Angular 7):

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

Saya juga membuat contoh di Stackblitz: https://stackblitz.com/edit/angular-abelrm


Jika saya melakukan ini, maka saya mendapatkan kesalahan: Kesalahan: Tidak dapat menetapkan referensi atau variabel!
Junias

hm, saya sudah mendapatkan kesalahan ini: Penolakan Janji Tidak Tertangani: Tidak dapat menetapkan referensi atau variabel! ; Zona: <root>; Tugas: Janji. Lalu; Nilai: Kesalahan: Tidak dapat menetapkan referensi atau variabel! Dan bagaimana kotak centang itu tahu, apakah harus dinyalakan / dimatikan? Dalam Angular 1 saya bisa melakukannya seperti ini: $scope.loginData = {}; $scope.loginData.username = window.localStorage.getItem("username");dan ini di templat:<ion-toggle ng-model="saveUsername" ng-change="toggleSaveUsername()" toggle-class="toggle-energized">Benutzername speichern</ion-toggle>
Junias

1
Untuk beberapa alasan, jika input tidak ada di dalam formulir, tetapi itu adalah bagian dari * ngFor loop, [(ngModel)]="saveUsername"tidak berfungsi, tetapi yang ini berfungsi. Itu pasti bug di sudut?
pemain baru

1
Ini bekerja untuk saya sementara [(ngModel)] berperilaku aneh. Dapatkah seseorang mengarahkan saya ke beberapa dokumentasi atau diskusi tentang mengapa [dicentang] lebih baik digunakan daripada ngModel dalam kasus kotak centang?
vc669

3
ketika ngModeldigunakan dalam formulir itu tidak akan berfungsi. [ngModelOptions]="{standalone: true}"adalah apa yang saya butuhkan.
rainversion_3

88

Sayangnya solusi yang disediakan oleh @hakani tidak mengikat dua arah . Itu hanya menangani model perubahan satu arah dari bagian UI / FrontEnd.

Alih-alih sederhana:

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

akan melakukan pengikatan dua arah untuk kotak centang.

Setelah itu, ketika Model checkboxFlag diubah dari Backend atau bagian UI - voila, checkboxFlag menyimpan status kotak centang aktual.

Yang pasti saya sudah menyiapkan kode Plunker untuk menyajikan hasilnya: https://plnkr.co/edit/OdEAPWRoqaj0T6Yp0Mfk

Hanya untuk melengkapi jawaban ini Anda harus memasukkan import { FormsModule } from '@angular/forms'ke app.module.tsdan tambahkan ke array impor yaitu

import { FormsModule } from '@angular/forms';

[...]

@NgModule({
  imports: [
    [...]
    FormsModule
  ],
  [...]
})

3
Tampaknya tidak berfungsi ketika Anda menggunakan kotak centang di dalam ngFor, sambil mengulangi array objek seperti[{"checked":true},{"checked":false}]
jackOfAll

Saya tidak bisa mendapatkan solusi ini untuk bekerja, saya dapatkancUncaught Error: Template parse errors: Can't bind to 'ngModel' since it isn't a known property of 'input'
sebnukem

5
@sebnukem Tampaknya Anda kehilangan menyatakan impor untuk FormsModule.
teddy

@sebnukem di dalam <input> nama properti diperlukan untuk [(ngModel)] untuk digunakan
Angela Pan

Apakah ini juga berfungsi untuk beberapa kotak centang? <input type="checkbox" [(ngModel)]="day.IsChecked" [checked]="day.IsChecked" />
barnes

35

Saya bekerja dengan Angular5 dan saya harus menambahkan atribut "nama" untuk membuat ikatan berfungsi ... "Id" tidak diperlukan untuk mengikat.

<input type="checkbox" id="rememberMe" name="rememberMe" [(ngModel)]="rememberMe">

1
Jawaban ini berhasil untuk saya. Jawaban lain juga benar. Tetapi dengan [(ngModel)] kita tidak perlu menulis fungsi terpisah untuk mengganti boolean
Jasmeet

25

Saya lebih suka sesuatu yang lebih eksplisit:

component.html

<input #saveUserNameCheckBox
    id="saveUserNameCheckBox" 
    type="checkbox" 
    [checked]="saveUsername" 
    (change)="onSaveUsernameChanged(saveUserNameCheckBox.checked)" />

komponen.ts

public saveUsername:boolean;

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

2
Satu-satunya hal di seluruh utas ini yang berfungsi. Terima kasih! Menggunakan sudut 8.2.11.
daka

Jawaban ini harus ada di atas.
harshit raghav

1
menyelamatkan hari saya :-)
hannes neukermans

6

Saat menggunakan <abc [(bar)]="foo"/>sintaks pada sudut.

Ini diterjemahkan menjadi: <abc [bar]="foo" (barChange)="foo = $event" />

Yang berarti komponen Anda harus memiliki:

@Input() bar;
@Output() barChange = new EventEmitter();

jawabannya sangat baik - pendek dan jelas, tetapi harus di bawah pertanyaan lain
Nikita

5

Anda bisa menggunakan sesuatu seperti ini untuk mengikat data dua arah:

<input type="checkbox" [checked]="model.property" (change)="model.property = !model.consent_obtained_ind">

3

Agar kotak centang berfungsi, Anda harus mengikuti semua langkah ini:

  1. impor FormsModule dalam modul Anda
  2. Masukkan input ke dalam formtag
  3. input Anda harus seperti ini:

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

    Catatan: jangan lupa untuk memasukkan nama dalam input Anda.


3

Anda harus menambahkan name="selected"atribut ke inputelemen.

Sebagai contoh:

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

2

Saya telah melakukan komponen kustom mencoba mengikat dua arah

Mycomponent: <input type="checkbox" [(ngModel)]="model" >

_model:  boolean;   

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

@Input('checked')
set model(checked: boolean) {

  this._model = checked;
  this.checked.emit(this._model);
  console.log('@Input(setmodel'+checked);
}

get model() {
  return this._model;
}

Yang aneh adalah ini bekerja

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

sementara ini tidak akan

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

1

Dalam situasi apa pun, jika Anda harus mengikat nilai dengan kotak centang yang bukan boolean maka Anda dapat mencoba opsi di bawah ini

Dalam file Html:

<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'">
</div>

dalam komponenischeckedWithOutBoolean: any = 'Y';

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


1

Saya tahu ini mungkin merupakan jawaban yang berulang tetapi bagi siapa pun yang ingin memuat daftar kotak centang dengan kotak centang pilih semua ke dalam bentuk sudut, saya ikuti contoh ini: Pilih semua / hapus centang semua kotak centang menggunakan sudut 2+

itu berfungsi dengan baik tetapi hanya perlu menambahkan

[ngModelOptions]="{standalone: true}" 

HTML akhir harus seperti ini:

<ul>
    <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}}
    </li>
  </ul>

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;
      })
  }

Semoga ini bisa membantu thnx


0

Sebuah solusi untuk mencapai hal yang sama khususnya jika Anda ingin menggunakan kotak centang dengan for loop adalah menyimpan keadaan kotak centang di dalam array dan mengubahnya berdasarkan indeks dari *ngFor loop. Dengan cara ini Anda dapat mengubah status kotak centang di komponen Anda.

app.component.html

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

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;
    }
  }

0

Arahan sudut saya seperti angularjs (ng-true-value ng-false-value)

@Directive({
    selector: 'input[type=checkbox][checkModel]'
})
export class checkboxDirective {
    @Input() checkModel:any;
    @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);
    }

}

html

<input type="checkbox" [(checkModel)]="check" [trueValue]="1" [falseValue]="0">

Hai, tolong jelaskan masalah Anda, apa yang telah Anda coba dan tambahkan beberapa konteks untuk pertanyaan Anda
538ROMEO

0

Di p-checkbox Angular,

Gunakan semua atribut p-checkbox

<p-checkbox name="checkbox" value="isAC" 
    label="All Colors" [(ngModel)]="selectedAllColors" 
    [ngModelOptions]="{standalone: true}" id="al" 
    binary="true">
</p-checkbox>

Dan yang lebih penting, jangan lupa untuk memasukkan [ngModelOptions]="{standalone: true}dan juga MENYIMPAN HARI SAYA.


0
Angular: "9.0.0"
Angular CLI: 9.0.1
Node: 13.10.1
OS: linux x64

file .html

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

File .ts

userConsent: boolean = false;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.