I have a data driven Angular application. I have a toggle component which I pass in a toggled state. My issue is that the two way data binding does not seem to work unless i pass in the toggle boolean as an object. Is there a way to get this to work without using an EventEmitter or passing the variable in as an object. This is to be a reusable component and the application is heavily data driven so passing the value in as an object in not an option. My code is....
toggle.html
<input type="checkbox" [(ngModel)]="toggled" [id]="toggleId" name="check"/>
toggle.component.ts
import { Component, Input, EventEmitter, Output } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'toggle-switch',
templateUrl: 'toggle-switch.component.html',
styleUrls: ['toggle-switch.component.css']
})
export class ToggleSwitchComponent {
@Input() toggleId: string;
@Input() toggled: boolean;
}
parent.component.html
<toggle-switch toggleId="toggle-1" [(toggled)]="nongenericObject.toggled"></toggle-switch>
For
[(toggled)]="..."
to work you needSee also Two-way binding
[UPDATE] - 25 June 2019
From @Mitch's comment below:
It's worth noting that the
@Output
name must be the same as the@Input
name, but withChange
on the end. You can't call itonToggle
or something. It's a syntax convention.Although the question has more than 2 years old I want to contribute my 5 cents...
It isn't a problem about Angular, its about how Javascript works... Simple variables (number, string, boolean, etc) are passed by value whereas complex ones (objects, arrays) are passed by reference:
You can read more about this in Kyle Simpson´s series You dont know js:
https://github.com/getify/You-Dont-Know-JS/blob/master/types%20%26%20grammar/ch2.md#value-vs-reference
So, you can use an @Input() object variable to share scope between components without need to use emitters, observers and whatever similar.
This way you can modify all object properties and you get same value in both components because they share same reference.