検索機能を備えたアプリケーションに取り組んでいます。
現在、アプリケーション1に2つのコンポーネントがあります。1Navbar 2. SearchGridList
Navbarコンポーネントにはテキストボックスが含まれています。テキストボックスに検索クエリを入力してEnterキーを押すと、このコンポーネントがAPI呼び出しを行い、データを取得します。データが戻ってきたら、このデータをSearchGridListコンポーネントの配列に入力します。
Angularのコンポーネント内でデータを渡すことを理解するのに苦労しています、誰かが私のコードを見て私をガイドしてください。
navbar.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() {
}
}
navbar.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>
search-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() {
}
}
@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
}
});
}
...
}
グリッドコンポーネントでは、resultGridList
パラメータとして@Input
を使用します
export class SearchGridListComponent implements OnInit {
@Input() public resultGridList : Array <any> = [];
...
}
さて、今あなたのAppコンポーネントでは、次の方法でこの2つに参加
アプリテンプレートhtml:
<app-navbar (found)="handleResults($event)"></app-navbar>
<app-search-grid-list [resultGridList]="data"></app-search-grid-list>
そしてApp tsファイルで:
data = [];
...
handleResults(searchObj) {
this.data = searchObj
}
BehaviorSubject
にDataService
を作成できます
private messageSource = new BehaviorSubject<string>('service');
このデモを参照して、コンポーネント間でデータを受け渡すことができます。