[英]How can i share a variable value between 2 components in angular 2
I am playing around with angular2. 我在玩angular2。 I have created 1 component using angular cli called appmenu.
我已经使用名为appmenu的angular cli创建了1个组件。
appmenu.html as follows: appmenu.html如下:
<ul>
<li (click)="menuitem1()">Menu Item 1</li>
<li>Menu Item 2</li>
<li>Menu Item 3</li>
</ul>
i wish to fetch the value of testvariable
on app.component.html, but i dont know what should i do in my app.component.ts
我希望在
testvariable
上获取testvariable
的值,但我不知道我应该在app.component.ts
做什么
appmenu.ts as follows
import { Component, OnInit } from '@angular/core';
import { Injectable } from '@angular/core';
@Component({
providers: [AppMenuService], // GIVING ERROR HERE
selector: 'app-appmenu',
templateUrl: './appmenu.component.html',
styleUrls: ['./appmenu.component.css']
})
export class AppmenuComponent implements OnInit {
public testvariable = "1st";
public data: any;
// constructor(private sharedData: AppMenuService) { }
ngOnInit() {
// this.data = this.sharedData.data;
// console.log(this.data);
}
menuitem1(){
console.log("Menu item 1 clicked");
}
}
appmenu.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class AppMenuService{
public data: any;
constructor() {
this.data = 'Lorem ipsum dolor sit.';
}
}
Getting error on appmenu.component.ts
here -> providers: [AppMenuService]
, it says cannot find name AppMenuService 在此处
appmenu.component.ts
出现错误-> providers: [AppMenuService]
,它说找不到名称AppMenuService
You can use the @ViewChild annotation for this in your parent component: 您可以在父组件中使用@ViewChild批注:
@ViewChild(AppmenuComponent) appComponent: AppmenuComponent;
https://angular.io/docs/ts/latest/cookbook/component-communication.html https://angular.io/docs/ts/latest/cookbook/component-communication.html
If you want to statically share a variable between two components you can declare this variable in some service and use this variable by injecting this service. 如果要在两个组件之间静态共享变量,则可以在某些服务中声明此变量,并通过注入此服务来使用此变量。 Eg
例如
// shared-data.service.ts
export class SharedDataService {
public data: any;
constructor() {
this.data = 'Lorem ipsum dolor sit.';
}
}
// app.component.ts
@Component({ ... })
export class AppComponent implements OnInit {
public data: any;
constructor(private sharedData: SharedDataService) { }
public ngOnInit() {
this.data = this.sharedData.data;
}
}
// app-menu/app-menu.component.ts
@Component({ ... })
export class AppMenuComponent implements OnInit {
public data: any;
constructor(private sharedData: SharedDataService) { }
public ngOnInit() {
this.data = this.sharedData.data;
}
}
But commonly when you need to shared some data between parent and child components you need to use @Input
and @Output
. 但是通常,当您需要在父组件和子组件之间共享某些数据时,需要使用
@Input
和@Output
。 @Input
allows you to pass data directly to the child component/directive. @Input
允许您将数据直接传递到子组件/指令。 @Output
allows you to listen events of child component. @Output
允许您侦听子组件的事件。 Learn more here . 在这里了解更多。
Eg 例如
// app.component.ts
@Component({
template: `
<app-menu
[someData]="dataForChild"
(menuClick)="handleMenuClick($event)">
</app-menu>
`
})
export class AppComponent implements OnInit {
public dataForChild: any;
constructor() { }
public ngOnInit() {
this.dataForChild = 'Lorem ipsum dolor sit.'
}
public handleMenuClick(itemIndex) {
console.log(itemIndex);
}
}
// app-menu/app-menu.component.ts
@Component({
selector: 'app-menu',
template: `
<ul>
<li (click)="transferMenuClick(1)">Menu item 1</li>
<li (click)="transferMenuClick(2)">Menu item 2</li>
<li (click)="transferMenuClick(3)">Menu item 3</li>
</ul>
`
})
export class AppMenuComponent implements OnInit {
@Output('menuClick')
public menuClick: EventEmitter<number>;
@Input('someData')
public someData: any;
constructor(private sharedData: SharedDataService) {
this.menuClick = new EventEmitter<number>;
}
public ngOnInit() {
console.log(this.someData);
}
public transferMenuClick(itemIndex) {
this.menuClick.emit(itemIndex);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.