[英]Pass api response from one component to another component in Angular
[英]Unable to pass response object from one component to another in angular 2
import { Component, Input, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { FetchService } from '../fetch. Service';
@Component({
selector: 'app-first',
templateUrl: './first.component.html',
styleUrls: ['./first.component.css']
})
export class FirstComponent implements OnInit {
constructor(private FetchService : FetchService,private router : Router) { }
ngOnInit(): void {
this.getData()
}
@Input() items: any;
getData(){
this.FetchService.fetchData().subscribe(data => {
this.items=data;
console.log(this.items + "first")
},
error => console.error(error)
)
}
second(){
this.router.navigateByUrl("/second")
}
}
在第二个组件 HTML 和 Ts -
<app-first [items]="fetchBirds"></app-first>
export class SecondComponent implements OnInit {
constructor() { }
fetchBirds:any
ngOnInit(): void {
this.data()
}
data(){
console.log(this.fetchBirds + "2nd")
}
}
我有两个组件,第一个和第二个。 我有响应,我可以在第一个 component.ts 中获取并在控制台中打印。 我正在使用@Input并将其传递给第二个组件,但它在第二个组件中未定义。 请帮忙。
@Input 用于将数据从父组件传递到子组件。 在这里,您的 Second 组件似乎是父组件。
当您像这样在第二(父)组件中使用您的第一个(子)组件时 -
<app-first [items]="fetchBirds"></app-first>
fetchBirds应该属于 Parent (第二个组件),它的值在第二个组件中获取。
并且项目应该属于 Child (第一个组件),它的值将通过使用 @Input 来获取,如下所示 -
@Input() items: any;
在您的情况下,您从子组件中的服务获取数据并将其分配给来自父组件的项目。
要么获取值是父项并将其传递给子项,要么如果您可以在子项中获取,则不需要@Input。
根据你的代码。 您正在第二个组件中加载第一个组件。 所以父组件是第二个组件。 子组件是第一个组件。 您还需要将数据从第一个组件传递到第二个组件,这意味着有一个子数据传递给父数据。 在那里你需要使用 output() 装饰器。
第二个组件(父组件)
<app-first (dataEvent)="receiveData($event)"></app-first>
export class SecondComponent implements OnInit {
constructor() { }
data:any; //any or your model
receiveData($event) {
this.data= $event
}
}
第一个组件(子组件)
export class FirstComponent implements OnInit {
constructor(private FetchService : FetchService,private router : Router) { }
ngOnInit(): void {
this.getData()
}
@Output() dataEvent = new EventEmitter<string>();
getData(){
this.FetchService.fetchData().subscribe(data => {
this.items = data;
console.log(this.items + "first")
this.dataEvent.emit(this.items);
},
error => console.error(error)
)
}
我同意 Priyesha,在这种情况下您不需要 @Input。
只需使用 @Inject 并直接在第一个组件中获取第二个组件。 任何公共属性或方法都将可用:
import { Component, Inject, Input, OnInit } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-first',
templateUrl: './first.component.html',
styleUrls: ['./first.component.css']
})
export class FirstComponent implements OnInit {
protected items: any;
constructor(
private router: Router,
@Inject(SecondComponent) protected component: SecondComponent) { }
public ngOnInit(): void {
this.items = this.component.fetchBirds;
console.log('first:', this.items);
}
public second(): void {
this.router.navigateByUrl("/second")
}
}
请注意,这只是可能的,因为<app-first></app-first>
包含在 SecondComponent 的 html 中,因此可以通过 FirstComponent 中的 DI 访问 SecondComponent。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.