【发布时间】:2017-10-04 02:02:05
【问题描述】:
所以,我正在创建一个基本的 Airbnb 搜索。我有 3 个组件: SearchComponent,其中包括搜索表单; ListingComponent,列出了Airbnb的租金;和 MapComponent,它在谷歌地图上显示每个租赁所在的标记。 SearchComponent 是 ListingComponent 和 MapComponent 的父组件,我使用 Router 模块在两个子组件之间导航。为了让两个子组件在列表或地图中显示租金,它们需要在 SearchComponent 中输入表单的输入值。如何将此值传递给两个子组件?
search.component.html
我希望这个 locationSearch 输入值通过 <router-outlet></router-outlet> 传递给我的两个子组件。
<form class="mui-form">
<div class="mui-textfield mui-textfield--float-label">
<input type="text" name="locationSearch" [(ngModel)]="locationSearch" (keyup)="searchLocation()">
<label>Location</label>
</div>
</form>
<router-outlet></router-outlet>
search.component.ts
import { Component, OnInit } from '@angular/core';
import { SearchService } from "app/search.service";
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.scss']
})
export class SearchComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
更新 - 似乎仍然无法正常工作
由于某种原因,我的 list.component.ts 中的 location 属性在我更改搜索时没有更新。
路线
const appRoutes: Routes = [
{ path: '', component: SearchComponent, children: [
{ path: '', redirectTo: 'listing', pathMatch: 'full' },
{ path: 'listing', component: ListingComponent },
{ path: 'map', component: MapComponent }
]},
{ path: 'detail/:id', component: ListingDetailComponent },
];
search.service.ts
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/Rx';
@Injectable()
export class SearchService {
private _inputValue = new BehaviorSubject('Starting Value');
inputValue$ = this._inputValue.asObservable();
updateSearch(search: string) {
this._inputValue.next(search);
}
}
search.component.ts
该组件中的位置值正在更新,但list.component.ts中没有更新
import { Component, OnInit, OnDestroy } from '@angular/core';
import { SearchService } from "app/search.service";
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.scss'],
providers: [ SearchService ]
})
export class SearchComponent implements OnInit {
locationSearch: string;
location: string = 'None';
constructor(private searchService: SearchService) {
this.searchService.inputValue$.subscribe(res => this.location = res); // This location value is updating
}
ngOnInit() {}
updateInput() {
this.searchService.updateSearch(this.locationSearch);
}
}
list.component.ts
import { Component, Input, OnInit, OnDestroy } from '@angular/core';
import { AirbnbService } from "app/airbnb.service";
import { SearchService } from "app/search.service";
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'app-listing',
templateUrl: './listing.component.html',
styleUrls: ['./listing.component.scss'],
providers: [ SearchService ]
})
export class ListingComponent implements OnInit {
listings;
location: string = 'None';
constructor(private airbnb: AirbnbService, private searchService: SearchService) {
this.searchService.inputValue$.subscribe(res => this.location = res);
// Output rentals
this.airbnb.getByLocation().subscribe(res => {
console.log(res.search_results);
this.listings = res.search_results; // this listings property isn't updating for some reason.
});
}
ngOnInit() {}
}
【问题讨论】:
-
使用angular.io/docs/ts/latest/cookbook/…中解释的共享服务
-
@GünterZöchbauer 我想我对如何在服务中访问 SearchComponent 的输入字段值感到困惑......一旦我弄清楚了,我会很高兴的。
-
组件应将其传递给服务。服务不应主动访问组件。
-
哦,好的。我明白了!谢谢
-
嘿@GünterZöchbauer,你能再看看我的代码吗?出于某种原因,我在
list.component.ts中的位置属性在我更改搜索时没有更新。不太清楚是什么问题。
标签: angular angular2-routing angular2-services angular2-directives