【发布时间】:2017-04-12 23:22:34
【问题描述】:
我有一个带有子路由的父组件。我想做的是在他们之间共享一个项目变量。项目价值可以改变,当它改变时,我需要更新所有的路线页面。我一直在关注anuglar2 tutorial 如何实现这一目标。但是,当我第一次安装调用我的 observable 时遇到问题。当我第一次调用它时,该值不会显示,但是,当我更新它时,该值就会显示。我无法弄清楚为什么项目变量最初没有值。有谁知道这是为什么以及如何解决它?
父路由(可以设置和更新项目的地方)
onSubmit(value: any, valid: any) {
if (valid) {
// http request to get project
this.ad.searchProject(value)
.subscribe(
response => {
// If projet found set value in service
this.ad.setProject(response);
// navigate to child rotue
this.router.navigate(['./project'], { relativeTo: this.route });
},
error => {
console.log(error)
},
() => {
console.log("Project Loaded");
}
);
}
}
项目服务.ts
@Injectable()
export class ProjectService {
public project: Project;
// Observable string sources
private projectSource = new Subject<Project>();
// Observable string streams
projectListener$ = this.projectSource.asObservable();
constructor(private http: Http) {
}
searchProject(value: string): Observable<any> {
return this.http.post('/controller/Project/SearchProject', { value: value }, { headers: headers })
.map(response => response.json());
}
// Service message commands
setProject(project: Project) {
this.projectSource.next(project);
console.log("call setProject");
}
}
子路线
export class ChildComponent {
project: Project = null;
subscription: Subscription;
constructor(private ad: ProjectService) {
console.log("call child route");
this.subscription = this.ad.projectListener$.subscribe(
value => {
// Called after second value is entered
console.log("call subscription");
console.log(value);
this.project = value;
});
}
}
控制台日志
[HMR] connected
call parent route
Gravity_Project
setProject
Project Loaded
call child route
// done with first project entry
Waves Project
call subscription
Object {id: 1001, typeID: 45004, studentID: 10000…}
call setProject
Project Loaded
// done with second project entry
【问题讨论】:
标签: angular typescript observable