Jestem dość nowy w Angular2 i mam mały problem:
W moim Login-Component-HTML mam dwa pola wyboru, które chcę powiązać w sposób dwukierunkowy z danymi do Login-Component-TypeScript.
To jest HTML:
<div class="checkbox">
<label>
<input #saveUsername [(ngModel)]="saveUsername.selected" type="checkbox" data-toggle="toggle">Save username
</label>
</div>
A to jest 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']);
}
Po kliknięciu pola wyboru otrzymuję poprawną wartość w kontrolerze (komponencie).
Ale jeśli zmienię wartość np. saveUsername
W komponencie, pole wyboru nie „dostanie” nowej wartości.
Więc nie mogę manipulować polem wyboru z komponentu (tak jak chcę to zrobić w ngOnInit
komponencie.
Dzięki za pomoc!
html
angular
typescript
checkbox
data-binding
Junias
źródło
źródło
Odpowiedzi:
Możesz usunąć
.selected
zesaveUsername
swojego pola wyboru, ponieważ saveUsername jest wartością logiczną. Zamiast[(ngModel)]
używać[checked]="saveUsername" (change)="saveUsername = !saveUsername"
Edycja: prawidłowe rozwiązanie:
Aktualizacja: Jak zauważył @newman, gdy
ngModel
jest używany w formularzu, nie działa. Powinieneś jednak użyć[ngModelOptions]
atrybutu podobnego (testowany w Angular 7):Stworzyłem również przykład w Stackblitz: https://stackblitz.com/edit/angular-abelrm
źródło
$scope.loginData = {}; $scope.loginData.username = window.localStorage.getItem("username");
i to w szablonie:<ion-toggle ng-model="saveUsername" ng-change="toggleSaveUsername()" toggle-class="toggle-energized">Benutzername speichern</ion-toggle>
[(ngModel)]="saveUsername"
nie działają, ale ta działa. To musi być błąd kątowy?ngModel
zostanie użyty w formularzu, nie będzie działać.[ngModelOptions]="{standalone: true}"
jest to, czego potrzebowałem.Niestety rozwiązanie dostarczone przez @hakani nie jest wiązaniem dwukierunkowym . Obsługuje tylko jednokierunkowy zmieniający się model z interfejsu użytkownika / części FrontEnd.
Zamiast tego prosty:
wykona dwukierunkowe wiązanie dla pola wyboru.
Następnie, gdy Model checkboxFlag jest zmieniany z części Backend lub UI - voila, checkboxFlag przechowuje rzeczywisty stan pola wyboru.
Dla pewności przygotowałem kod Plunker do prezentacji wyniku: https://plnkr.co/edit/OdEAPWRoqaj0T6Yp0Mfk
Aby wypełnić tę odpowiedź, należy dołączyć tablicę
import { FormsModule } from '@angular/forms'
doapp.module.ts
i dodać do tablicy importu, tjźródło
ngFor
, a jednocześnie powtarzasz szereg obiektów, takich jak[{"checked":true},{"checked":false}]
cUncaught Error: Template parse errors: Can't bind to 'ngModel' since it isn't a known property of 'input'
<input type="checkbox" [(ngModel)]="day.IsChecked" [checked]="day.IsChecked" />
Pracuję z Angular5 i musiałem dodać atrybut „name”, aby powiązanie działało ... „Identyfikator” nie jest wymagany do wiązania.
źródło
Wolę coś bardziej wyraźnego:
component.html
component.ts
źródło
8.2.11
.Podczas korzystania ze
<abc [(bar)]="foo"/>
składni na kątowej.To przekłada się na:
<abc [bar]="foo" (barChange)="foo = $event" />
Co oznacza, że twój komponent powinien mieć:
źródło
Możesz po prostu użyć czegoś takiego, aby uzyskać dwukierunkowe powiązanie danych:
źródło
Aby uzyskać działanie pola wyboru, wykonaj następujące czynności:
FormsModule
do swojego modułuform
znacznikuTwój wkład powinien wyglądać następująco:
Uwaga: nie zapomnij podać nazwy w danych wejściowych.
źródło
Musisz dodać
name="selected"
atrybut doinput
elementu.Na przykład:
źródło
Zrobiłem niestandardowy komponent próbowałem powiązania dwukierunkowego
Mykomponent:
<input type="checkbox" [(ngModel)]="model" >
dziwne, że to działa
podczas gdy to nie będzie
źródło
W każdej sytuacji, jeśli musisz powiązać wartość z polem wyboru, które nie jest wartością logiczną, możesz wypróbować poniższe opcje
W pliku HTML:
w komponencie
ischeckedWithOutBoolean: any = 'Y';
Zobacz w stackblitz https://stackblitz.com/edit/angular-5szclb?embed=1&file=src/app/app.component.html
źródło
Wiem, że może to być powtórzona odpowiedź, ale dla każdego, kto chce załadować listę pól wyboru z zaznaczeniem pola wyboru do postaci kątowej, postępuję zgodnie z tym przykładem: Zaznacz wszystko / odznacz wszystko pole wyboru za pomocą kątownika 2+
działa dobrze, ale wystarczy dodać
końcowy HTML powinien wyglądać tak:
Maszynopis
mam nadzieję, że dzięki
źródło
Obejściem tego problemu, szczególnie jeśli chcesz użyć pola wyboru z pętlą for, jest przechowywanie stanu pola wyboru w tablicy i zmienianie go na podstawie indeksu
*ngFor
pętli. W ten sposób możesz zmienić stan pola wyboru w swoim komponencie.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
źródło
Moja dyrektywa kątowa jak angularjs (ng-true-value ng-false-value)
HTML
źródło
W polu Angular p-checkbox
Użyj wszystkich atrybutów pola wyboru p
A co ważniejsze, nie zapomnij dołączyć
[ngModelOptions]="{standalone: true}
tak, aby OSZCZĘDZIŁ MÓJ DZIEŃ.źródło
plik .html
plik .ts
źródło