简体   繁体   English

我如何在角度2的2个分量之间共享变量值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM