BehaviorSubject
工作正常,但却被困在哪里开始。以下是我想做的:
HeroDetailComponent
在这里,我输入一些文本,并根据这些文本搜索英雄列表,并使用另一个组件向用户显示他们
HeroesComponent
. 现在,应该使用服务组件在的帮助下完成此通信
以下是我的主要内容:
app.component.html
<app-hero-detail></app-hero-detail>
<app-heroes></app-heroes>
这是我的
hero-detail.component.html
<div>
<label>name:
<input [(ngModel)]="hero.name" placeholder="name"/>
</label>
</div>
以及相应的
import { Component, OnInit, Input } from '@angular/core';
import { Hero } from '../hero';
@Component({
selector: 'app-hero-detail',
templateUrl: './hero-detail.component.html',
styleUrls: ['./hero-detail.component.css']
})
export class HeroDetailComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
这是我的
,我在这里显示搜索结果:
<h2>My Heroes</h2>
<ul class="heroes">
<li *ngFor="let hero of heroes"
<span class="badge">{{hero.id}}</span> {{hero.name}}
</li>
</ul>
及其
heromes.component.ts
import { Component, OnInit } from '@angular/core';
import { Hero } from '../hero';
import { HEROES } from '../mock-heroes';
import { HeroService } from '../hero.service';
@Component({
selector: 'app-heroes',
templateUrl: './heroes.component.html',
styleUrls: ['./heroes.component.css']
})
export class HeroesComponent implements OnInit {
heroes = HEROES;
constructor(private heroService: HeroService) { }
getHeroes(): void {
// Logic to access heroes list matching search text and display to user
}
ngOnInit() {
this.getHeroes();
}
}
这是我的服务组件:
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable({
providedIn: 'root'
})
export class HeroService {
private searchSource = new BehaviorSubject<string>("");
searchText = this.searchSource.asObservable();
constructor() { }
searchByName(name: string) {
this.searchSource.next(name);
}
}
这是我的英雄模拟数据列表:
import { Hero } from './hero';
export const HEROES: Hero[] = [
{ id: 11, name: 'Mr. Nice' },
{ id: 12, name: 'Narco' },
{ id: 13, name: 'Bombasto' },
{ id: 14, name: 'Celeritas' },
{ id: 15, name: 'Magneta' },
{ id: 16, name: 'RubberMan' },
{ id: 17, name: 'Dynama' },
{ id: 18, name: 'Dr IQ' },
{ id: 19, name: 'Magma' },
{ id: 20, name: 'Tornado' }
];
更新:
我遵循了trichetriche答案中给出的步骤,但我发现以下错误:
ERROR in src/app/hero-detail/hero-detail.component.ts(17,16): error TS2339: Property 'formValue$' does not exist on type 'HeroService'.
src/app/hero-detail/hero-detail.component.ts(17,61): error TS2304: Cannot find name 'startWith'.
src/app/heroes/heroes.component.ts(17,13): error TS2304: Cannot find name 'combineLatest'.
src/app/heroes/heroes.component.ts(19,22): error TS2339: Property 'formValue$' does not exist on type 'HeroService'.
src/app/heroes/heroes.component.ts(21,5): error TS2552: Cannot find name 'map'. Did you mean 'Map'?
更新:
以上错误现已解决。现在我开始面对可观察到的问题:
Observable.js:54 TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
at subscribeTo (subscribeTo.js:41)
at subscribeToResult (subscribeToResult.js:11)
at CombineLatestSubscriber.push../node_modules/rxjs/_esm5/internal/observable/combineLatest.js.CombineLatestSubscriber._complete (combineLatest.js:62)
at CombineLatestSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.complete (Subscriber.js:66)
at Observable._subscribe (subscribeToArray.js:8)
at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe (Observable.js:43)
at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js:29)
at CombineLatestOperator.push../node_modules/rxjs/_esm5/internal/observable/combineLatest.js.CombineLatestOperator.call (combineLatest.js:32)
at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js:24)
at MapOperator.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapOperator.call (map.js:18)
你能帮我解决这个问题吗。