以角度将数据从一个组件传递到另一个组件

Ksh*_*ari 7 javascript arrays components typescript angular

我正在开发一个包含搜索功能的应用程序。

现在我在应用程序 1. Navbar 2. SearchGridList 中有 2 个组件

Navbar 组件包含一个文本框,您可以在其中输入搜索查询并按 Enter,该组件将进行 api 调用并获取数据。当数据回来时,我想将此数据填充到 SearchGridList 组件中的数组中。

我很难理解在 Angular 中的组件内传递数据,有人可以看看我的代码并指导我。

导航栏.component.ts

import { Component, OnInit, Input, Output } from '@angular/core';
import {DataService} from '../../services/data.service';
import {SearchResults} from '../class/search.class';
import {SearchGridListComponent} from '../search-grid-list/search-grid-list.component';
import { EventEmitter } from '@angular/core';

@Component({
  selector: 'app-navbar',
  templateUrl: './navbar.component.html',
  styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {

  searchQuery : String;
  //searchResultList : Array<any> = [];

  constructor(private dataService :  DataService) { }

  doSearch () : any
  {
    this.dataService.doSQLSearch(this.searchQuery)
    .then ((data:any)=>{
      for (var i =0; i<data.Results.length;i++){
        let searchObj = new SearchResults(data.Results[i]);
        //I want to push data into array from SearchGrid like this 
        resultGridList.push(searchObj);

      }
    });
   }

  ngOnInit() {
  }
}
Run Code Online (Sandbox Code Playgroud)

导航栏.component.html

<mat-toolbar class="main-header">
  <a href="/">
  <img src="../../../assets/vms-header-logo.png" id= "header-logo">
  </a>
    <form class="search-box">
      <mat-form-field  class="search-box-full-width">
        <input id ="search-textbox" matInput placeholder="Enter a Barcode, DSID or any search term" name="Search" [(ngModel)]="searchQuery" (keyup.enter)="doSearch()" autocomplete="off">
      </mat-form-field>
    </form>
</mat-toolbar>
Run Code Online (Sandbox Code Playgroud)

搜索grid.component.ts

import { Component, OnInit, Input } from '@angular/core';
import {NavbarComponent} from '../navbar/navbar.component';

@Component({
  selector: 'app-search-grid-list',
  templateUrl: './search-grid-list.component.html',
  styleUrls: ['./search-grid-list.component.css'],
})
export class SearchGridListComponent implements OnInit {
  resultGridList : Array <any> = [];
  constructor() { }

  ngOnInit() {
  }

}
Run Code Online (Sandbox Code Playgroud)

Hie*_*yen 6

你可以BehaviorSubject在你的DataService

private messageSource = new BehaviorSubject<string>('service');
Run Code Online (Sandbox Code Playgroud)

您可以参考此演示在组件之间传递数据。

https://stackblitz.com/edit/behavior-subject-2019

  • 是的.. 我也可以推荐 BehaviourSubject。因此,例如我将它用于身份验证状态..我写了一篇关于此的帖子:https://medium.com/@fransyozef/my-angular-dashboard-template-part-2-850a0854da74 (3认同)

Kam*_*ski 6

您需要将以下@Output事件添加到导航栏:

export class NavbarComponent implements OnInit {
   ...
   @Output() public found = new EventEmitter<any>();
   ...
   doSearch () : any
   {
    this.dataService.doSQLSearch(this.searchQuery) .then ((data:any)=>{
      for (var i =0; i<data.Results.length;i++){
        let searchObj = new SearchResults(data.Results[i]);

        this.found.emit(searchObj);  // !!!! here emit event
                                     // however emitting events in loop looks strange... better is to emit one evet

      }
    });
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

好的,在您的网格组件中用作@Input参数resultGridList

export class SearchGridListComponent implements OnInit {

  @Input() public resultGridList : Array <any> = [];
  ...
}
Run Code Online (Sandbox Code Playgroud)

好的,现在在您的应用程序组件中按以下方式加入这两个组件

应用程序模板 html:

<app-navbar (found)="handleResults($event)"></app-navbar>

<app-search-grid-list [resultGridList]="data"></app-search-grid-list>
Run Code Online (Sandbox Code Playgroud)

在 App ts 文件中:

data = [];
...

handleResults(searchObj) {
  this.data = searchObj
}
Run Code Online (Sandbox Code Playgroud)

  • 这帮助我解决了我的问题。只是一个简单的问题,这是正确的方法吗?我知道我可以创建一个服务并注入它,但我不想创建只在应用程序中使用一次的服务。 (3认同)
  • @KshitijAnilRangari通常应用程序有N个服务(取决于restfulapi、db-backend-domain中的资源/请求),并且该组服务由K个组件使用,通常K&gt;N。我不知道你的域名怎么样。我的解决方案是标准方法,但是 [Hien](/sf/answers/3858806941/) 提出的解决方案也是有趣的(而且更先进)的替代方案。 (2认同)