在服务中有一些数据,并且当我在服务中的对象中有数据时工作正常,但是现在我已连接数据库连接,数据永远不会进入组件。
我希望服务订阅从数据库返回的数据并定义了这样的调用:
public setPerson(ac: string): void{
console.log(ac);
this.generatePerson(ac).subscribe((data) => {
// this.mapPersonFromInput(data[0]);
console.dir(data);
});
}
mapPersonFrominput()
函数是模拟数据的保留。它与下面的extractData基本相同,但是来自代码中的静态对象。
generatePerson看起来像这样:
public generatePerson(id: string):Observable<Person>{
var datRetUrl: string = '/api/'
var fullUrl: string = datRetUrl + id;
return this.http.get(fullUrl)
.map(this.extractData)
.catch(this.handleError);
}
extractData只是将输入对象的值分配给服务的对象结构,而handleerror只是将错误记录到控制台。
我通过从导航组件调用此函数来调用服务以在组件加载之前从组件初始化数据对象:
passCodeToService():void{
this.psn.setPerson(this.accessCode);
this.route.navigate(['/name']);
}
并且在应该获取数据的实际组件中,我正在使用ngOnInit,但我认为我应该使用ngOnChanges来初始化组件。这是我目前使用的代码,但还没有运气修复。
ngOnInit() {
this.name =this.psn.getName();
console.log(this.name);
}
getName()
只返回我在服务中存储的对象。
public getName(): Name{
return this.servicePerson.name;
}
答案 0 :(得分:4)
你不应该在这里使用ngOnChanges
,它不适合你想要做的事情。
根据你的问题,这是你想要实现的目标:
您可以使用您拥有的代码实现此目的。您需要做的就是添加更多代码并利用RxJS。更具体地说:
personSubject.next(dataFromDB)
添加到人员流。使用这种方法,每当数据来自您的数据库时,该数据将被添加到人流中,订阅该流(您的组件)的任何内容都将获取数据。
快速示例(因为我没有完整的代码):
import { ReplaySubject } from 'rxjs/ReplaySubject';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class PersonService {
// The person subject
personStream: ReplaySubject<Person> = new ReplaySubject();
// The person observable
person$(): Observable<Person> {
return this.personStream.asObservable();
}
// Get person from DB and add to stream
getDataFromDB() {
this.http.get(url).subscribe(response => {
this.personStream.next(response.person);
});
}
}
@Component({...})
export class MyComponent implements OnInit {
person: Person;
constructor(private personService: PersonService) {}
ngOnInit() {
// Subscribe to person observable. Any time person data changes, this will be called.
this.personService.person$().subscribe(person => this.person = person);
// If you return the `this.http.get(url)` from `getDataFromDB`, you can just do this instead...
this.personService.getDataFromDB().subscribe(person => this.person = person);
}
}
但这实在是太过分了,因为实际上你需要做的就是订阅组件中的getDataFromDB
函数,因为它本身可以返回一个可观察的Person类型。