Sou relativamente novo no Angular2 e tenho um pequeno problema:
No meu Login-Component-HTML, tenho duas caixas de seleção, que desejo vincular de maneira bidirecional à vinculação de dados ao Login-Component-TypeScript.
Este é o HTML:
<div class="checkbox">
<label>
<input #saveUsername [(ngModel)]="saveUsername.selected" type="checkbox" data-toggle="toggle">Save username
</label>
</div>
E este é o 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']);
}
Se clicar em uma caixa de seleção, obtenho o valor correto no controlador (componente).
Mas se eu alterar o valor de, por exemplo, saveUsername
no componente, a caixa de seleção não "obterá" o novo valor.
Portanto, não posso manipular a caixa de seleção do Componente (como quero fazer no ngOnInit
no componente.
Obrigado pela ajuda!
html
angular
typescript
checkbox
data-binding
Junias
fonte
fonte
Respostas:
Você pode remover
.selected
desaveUsername
sua entrada da caixa de seleção, pois saveUsername é um booleano. Em vez de[(ngModel)]
usar[checked]="saveUsername" (change)="saveUsername = !saveUsername"
Editar: Solução correta:
Atualização: como o @newman notou quando
ngModel
é usado em um formulário, ele não funciona. No entanto, você deve usar[ngModelOptions]
atributos como (testados no Angular 7):Também criei um exemplo no Stackblitz: https://stackblitz.com/edit/angular-abelrm
fonte
$scope.loginData = {}; $scope.loginData.username = window.localStorage.getItem("username");
e isso no modelo:<ion-toggle ng-model="saveUsername" ng-change="toggleSaveUsername()" toggle-class="toggle-energized">Benutzername speichern</ion-toggle>
[(ngModel)]="saveUsername"
não funcionará, mas esta funcionará. Deve ser um bug em angular?ngModel
é usado em um formulário, não funciona.[ngModelOptions]="{standalone: true}"
é o que eu precisava.Infelizmente, a solução fornecida por @hakani não é uma ligação de mão dupla . Ele apenas lida com o modelo de mudança unidirecional da parte UI / FrontEnd.
Em vez disso, o simples:
fará ligação bidirecional para a caixa de seleção.
Posteriormente, quando o modelo checkboxFlag é alterado do backend ou da parte da interface do usuário - voila, o checkboxFlag armazena o estado real da caixa de seleção.
Para garantir que eu preparei o código Plunker para apresentar o resultado: https://plnkr.co/edit/OdEAPWRoqaj0T6Yp0Mfk
Apenas para concluir esta resposta, você deve incluir o array
import { FormsModule } from '@angular/forms'
intoapp.module.ts
e add to imports, ou seja,fonte
ngFor
, enquanto repetindo uma matriz de objetos como[{"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" />
Estou trabalhando com o Angular5 e tive que adicionar o atributo "name" para fazer a ligação funcionar ... O "id" não é necessário para a ligação.
fonte
Eu prefiro algo mais explícito:
component.html
component.ts
fonte
8.2.11
.Ao usar a
<abc [(bar)]="foo"/>
sintaxe em angular.Isso se traduz em:
<abc [bar]="foo" (barChange)="foo = $event" />
O que significa que seu componente deve ter:
fonte
Você pode usar algo assim para ter uma ligação de dados bidirecional:
fonte
Para que a caixa de seleção funcione, siga todas estas etapas:
FormsModule
no seu móduloform
tagsua entrada deve ser assim:
Nota: não esqueça de colocar o nome na sua entrada.
fonte
Você deve adicionar
name="selected"
atributo aoinput
elemento.Por exemplo:
fonte
Eu fiz um componente personalizado tentei ligação em dois sentidos
Meucomponente:
<input type="checkbox" [(ngModel)]="model" >
coisa estranha é que isso funciona
enquanto isso não
fonte
Em qualquer situação, se você precisar vincular um valor a uma caixa de seleção que não seja booleana, tente as opções abaixo
No arquivo HTML:
no componente
ischeckedWithOutBoolean: any = 'Y';
Veja no stackblitz https://stackblitz.com/edit/angular-5szclb?embed=1&file=src/app/app.component.html
fonte
Sei que pode ser uma resposta repetida, mas para quem quiser carregar a lista de caixas de seleção com a caixa de seleção em forma angular, sigo este exemplo: Marque todas / desmarque todas as caixas de seleção usando angular 2+
funciona bem, mas só precisa adicionar
o HTML final deve ser assim:
TypeScript
espero que isso ajude thnx
fonte
Uma solução alternativa para obter o mesmo, especialmente se você deseja usar a caixa de seleção com loop for, é armazenar o estado da caixa de seleção em uma matriz e alterá-la com base no índice do
*ngFor
loop. Dessa forma, você pode alterar o estado da caixa de seleção no seu componente.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
fonte
Minha diretiva angular como angularjs (ng-true-value ng-false-value)
html
fonte
Na caixa de seleção p angular,
Use todos os atributos da caixa de seleção p
E o mais importante, não se esqueça de incluir
[ngModelOptions]="{standalone: true}
, além de salvar o meu dia.fonte
arquivo .html
arquivo .ts
fonte