In Angular2 (Beta 6) habe ich eine Komponente für ein Hauptmenü.Angular2 - Zwei-Wege-Datenbindung für eine Komponentenvariable/Komponentenklasseneigenschaft?
<mainmenu></mainmenu>
Ich möchte einen boolean für breit oder schmal binden. Also machte ich es in diese:
<mainmenu [(menuvisible)]="true"></mainmenu>
Aber was will ich (glaube ich) ist auf eine JavaScript-Klasse Eigenschaft zu binden (wie ich andere Dinge haben zu binden, aber ordentlich sein wollen durch eine einzige Klasse mit in die Komponente).
Ich erhalte einen Fehler
EXCEPTION: Template parse errors: Invalid property name 'menumodel.visible' ("
][(menumodel.visible)]="menumodel.visible">
Wenn ich das gleiches mit einer einzigen Variablen statt einer Klasse versuchen, erhalte ich:
Template parse errors: Parser Error: Unexpected token '='
Doch diese (? Eine Art und Weise bindend) scheint zu funktionieren (aber ich möchte das Menü auslösen, um weit/schmal von einer anderen Komponente zu gehen, so dass dies eine bidirektionale Datengebundene Eigenschaft sein sollte):
<menu [vis]="true"></menu>
Diese
ist ein bisschen meine Menükomponente:
@Component({
selector: 'menu',
templateUrl: './app/menu.html',
providers: [HTTP_PROVIDERS, ApplicationService],
directives: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, NgClass, NgForm]
})
export class MenuComponent implements OnInit {
mainmenu: MainMenuVM;
constructor(private _applicationService: ApplicationService) {
this.mainmenu = new MainMenuVM();
}
// ...ngOnInit, various functions
}
Hier ist meine MainMenu Ansicht Modell Klasse
export class MainMenuVM {
public visible: boolean;
constructor(
) { this.visible = true; }
}
Ich versuche, ein Menü zu erstellen, die Symbole und Text, kann aber gehen schmal, um nur Icons zu zeigen. Ich werde dieses Ereignis nach oben zu einer übergeordneten Komponente ausgeben, um die Position des Containers neben dem Menü zu ändern. Das Auslösen eines Inhaltscontainers zur Maximierung führt dazu, dass das Menü eng wird - ich sage nicht, dass dies der beste Weg ist, aber ich möchte diese spezielle Frage lösen, bevor ich tiefer gehe.
Bitte beachten Sie: Ich bin hier nicht auf eine Eingabesteuerung - nur Datenbindung an eine Komponente, so dass ich dann die Benutzeroberfläche ändern kann. Diese
ist von dem Winkel Spickzettel
<my-cmp [(title)]="name">
Sets up two-way data binding. Equivalent to: <my-cmp [title]="name" (titleChange)="name=$event">
Vielen Dank im Voraus!
UPDATE
Integration des Code von der akzeptierten Antwort und die Anpassung für meinen speziellen Anwendungsfall hier den endgültige Arbeitscode:
app.html
...header html content
// This is what I started with
<!--<menu [menuvisible]="true" (menuvisibleChange)="menuvisible=$event"></menu>-->
// This is two way data binding
// 1. Banana-in-a-box is the input parameter
// 2. Banana-in-a-box is also the output parameter name (Angular appends it's usage with Change in code - to follow shortly)
// 3. Banana-in-a-box is the short hand way to declare the commented out code
// 4. First parameter (BIAB) refers to the child component, the second refers the variable it will store the result into.
// 5. If you just need an input use the remmed out code with just the first attribute/value
<menu [(menuvisible)]="menuvisible"></menu>
.. div content start
<router-outlet></router-outlet>
.. div content end
app.component.ts (root)
export class AppComponent implements OnInit{
menuvisible: Boolean;
}
menu.component.ts (Kind root)
export class MenuComponent implements OnInit {
// Parameters - notice the appending of "Change"
@Input() menuvisible: boolean;
@Output() menuvisibleChange: EventEmitter<boolean> = new EventEmitter<boolean>();
// Init
ngOnInit() {
// Populate menu - fetch application list
this.getApplications();
// Initially we want to show/hide the menu depending on the input parameter
(this.menuvisible === true) ? this.showMenu() : this.hideMenu();
}
//...more code
}
menu.html
<div id="menu" [ngClass]="menuStateClass" style="position: absolute; top:0px; left: 0px;z-index: 800; height: 100%; color: #fff; background-color: #282d32">
<div style="margin-top: 35px; padding: 5px 0px 5px 0px;">
<ul class="menuList" style="overflow-x: hidden;">
<li>IsMenuVisible:{{menuvisible}}</li>
<li style="border-bottom: 1px solid #3d4247"><a (click)="toggleMenu()"><i class="fa fa-bars menuIcon" style="color: white; font-size: 16px;"></i></a></li>
<li *ngFor="#app of applications">
<a [routerLink]="[app.routerLink]">
<i class="menuIcon" [ngClass]="app.icon" [style.color]="app.iconColour" style="color: white;"></i>
<span [hidden]="menuStateTextHidden">{{ app.name }}</span>
</a>
</li>
</ul>
</div>
</div>
Denken Sie daran, zu importieren, was Sie brauchen zum Beispiel
import {Component, EventEmitter, OnInit, Input, Output} from 'angular2/core';
Sehr zu empfehlen Dieses Video auf You Tube: Angular 2 Tutorial (2016) - Inputs and Outputs
Ich finde deine Frage ziemlich verwirrend. Die Fehlermeldungen IMHO passen nicht zum angegebenen Code. Mir ist nicht klar, was du eigentlich machen willst. ' ' macht nicht viel Sinn. Warum solltest du eine Zwei-Wege-Bindung an "wahr" haben wollen? Dies macht auch keinen Sinn. "[(Menumodel.visible)] =" menumodel.visible "'. Sie können keine Eigenschaft mit einem '.' versehen und auf diese Weise eine Bindung an eine Untereigenschaft herstellen. –
Ich habe die Frage mit einem Snippet vom Angular Cheat Sheet aktualisiert. Es zeigt eine Komponente mit Zwei-Wege-Datenbindung. Ich vermute also, dass ich tun müsste, was ich in dem Spickzettel zusammen mit deiner Antwort unten finde. z.B. ? –
DanAbdn
menuvisible und vis sind einzelne Eigenschaften. menumodel war eine klassenbasierte Variable, wie auch das Hauptmenü. Der Code wurde weiterentwickelt, da ich diese Frage entschuldigen möchte. – DanAbdn