2016-10-24 2 views
54

I'm довольно новое Angular2 и у меня есть небольшая проблема:Угловое 2 Галочка двухсторонняя Привязка данных

В моей Вход-Компонентный-HTML, у меня есть две галочки, которые я хочу, чтобы связать в двухполосных данных привязка к элементу Login-Component-TypeScript.

Это HTML:

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

И это 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; 
     // Hole Usernamen aus Local Storage falls gespeichert werden soll 
     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']); 
    } 

Если я щелкните флажок, я получаю правильное значение в контроллере (компонент).

Но если я изменяю значение, например, saveUsername в компоненте, этот флажок не «получил» новое значение.

Так что я не могу манипулировать флажок из компонента (например, я хочу сделать в ngOnInit в компоненте.

Спасибо за вашу помощь!

ответ

98

вы можете удалить .selected из saveUsername в вашем флажком вход поскольку saveUsername является булевой вместо [(ngModel)] использования [checked]="saveUsername" (change)="saveUsername = !saveUsername"

Edit:. Правильное решение:

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

Если я это сделать, то я получаю сообщение об ошибке: Ошибка: Невозможно присвоить ссылку или переменной! – Junias

+0

hm, я уже получаю эту ошибку: Unhandled Promise rejection: Невозможно назначить ссылку или переменную! ; Зона: ; Задача: Promise.then; Значение: Ошибка: не может назначить ссылку или переменную! И как флажок знает, если он должен быть включен/выключен? В Angular 1 я мог бы сделать это вот так: '$ scope.loginData = {}; $ scope.loginData.username = window.localStorage.getItem ("username"); ' и это в шаблоне: ' Benutzername speichern ' – Junias

+0

не удалось удалить #saveUsername и повторить попытку. см. также plunker: http://embed.plnkr.co/ffkrDzon1L3ZANiuGFsp/ – hakany

3

Вы можете просто использовать что-то вроде этого, чтобы иметь два пути связывания данных:

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

К сожалению решение, предоставляемое @hakani является не двухстороннее связывание. Он просто обрабатывает одностороннюю меняющуюся модель из части UI/FrontEnd.

Вместо простой:

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

будет делать двухстороннюю привязку для флажка.

Впоследствии, когда модель checkboxFlag изменен с сайта Backend или UI - voila, checkboxFlag сохраняет фактическое состояние флажка.

Чтобы быть уверенным, я подготовил Plunker код, чтобы представить результат: https://plnkr.co/edit/OdEAPWRoqaj0T6Yp0Mfk

Просто, чтобы закончить этот ответ вы должны включить import { FormsModule } from '@angular/forms' в app.module.ts и добавить импорт массива т.е.

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

[...] 

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

Кажется, что не работает, когда вы используете флажок внутри 'ngFor', повторяя массив объектов, таких как' [{"checked": true}, {"checked": false}] ' – jackOfAll

+0

Я не могу заставить это решение работать, я получаю 'cUncaught Error: ошибки шаблона шаблона: не могу привязываться к 'ngModel', так как это не известное свойство 'input'' – sebnukem

+3

@sebnukem Кажется, что вам не удалось объявить импорт для FormsModule. – teddy

7

Я предпочитаю что-то более определенно:

component.html

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

Компонент.ц

public saveUsername:boolean; 

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

Я сделал пользовательский компонент попытался два способа связывания

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

странно вещь это работает

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

Хотя это обыкновение

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

При использовании <abc [(bar)]="foo"/> синтаксис на угловых.

Это приводит к: <abc [bar]="foo" (barChange)="foo = $event" />

Что означает, что ваш компонент должен иметь:

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

Чтобы получить флажок работы вы должны соблюдать все эти шаги:

  1. импорт FormsModule в модуле
  2. Поместите ввод внутри form тег
  3. ваш вход должен быть таким:

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

    Примечание: не забудьте поставить имя в входе.

6

Я работаю с Angular5, и мне пришлось добавить атрибут «name», чтобы получить привязку к работе ... «id» не требуется для привязки.

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

Вы должны добавить name="selected" атрибут input элемента.

Например:

<div class="checkbox"> 
    <label> 
     <input name="selected" [(ngModel)]="saveUsername.selected" type="checkbox">Benutername speichern 
    </label> 
    </div> 
Смежные вопросы