Angular 使用Observable和Subscriber传递数据,路径为角度2

Angular 使用Observable和Subscriber传递数据,路径为角度2,angular,angular-routing,angular-directive,angular-services,Angular,Angular Routing,Angular Directive,Angular Services,我有一个angular 2应用程序,我使用route在组件之间导航。为了在同级组件之间传递数据,我使用了Observable和Subscription模式。但是如何通过路由发送数据(我需要传递对象) 应用程序组件.ts @Component({ providers: [DataShareService] }) .... @Component({ selector: 'app-post-detail', templateUrl: './post-detail.component.htm

我有一个angular 2应用程序,我使用route在组件之间导航。为了在同级组件之间传递数据,我使用了Observable和Subscription模式。但是如何通过路由发送数据(我需要传递对象)

应用程序组件.ts

@Component({
 providers: [DataShareService]
})
....
@Component({
  selector: 'app-post-detail',
  templateUrl: './post-detail.component.html',
  styleUrls: ['./post-detail.component.css']
})
export class PostDetailComponent implements OnInit {

  private _postDetailPath: string;
  private dataSub: Subscription;
  private _post: IPost;

  constructor(private _router: Router,
              private _route: ActivatedRoute,
              private _config: ConfigService,
              private _dataShareService: DataShareService,
              private _logger: ErrorLogService) {

  }

  ngOnInit() {
    this.dataSub = this._dataShareService.dataSource$.subscribe(
      post => {
        this._post = post;
        console.log('post : ' + this._post);
      }, error => {
        console.log('errr0');
        this._logger.logError(error);
      },() => {console.log('post : error' )});

  }

  onBack(): void {
    this._router.navigate(['/posts'])
  }
  ngOnDestroy() {
    this.dataSub.unsubscribe();
  }

}
app.component.html

<router-outlet></router-outlet>
html中的链接

 <a [routerLink]="['/post',post.id]" (click)="createResponse(post)">{{post.title}}</a>
重定向后无法获取post detail的ngOnInit()中的数据


这是怎么回事?如果我不知道的话,你就把它的工作交给我。但是如何使其与路由一起工作?

必须由加载两个组件的模块或加载声明组件的两个模块的模块加载服务,这样您将拥有服务的单例实例,并且可以在两个组件之间共享数据


在您的情况下,请从组件提供程序中删除该服务,并将其放入app.module providers中。通过这种方式,您将拥有一个单例,并且可以共享数据。

必须由一个加载2个组件的模块或一个加载声明组件的两个模块的模块加载服务,这样您将拥有服务的单例实例,并且可以在两个组件之间共享数据


在您的情况下,请从组件提供程序中删除该服务,并将其放入app.module providers中。这样你就有了一个单件,数据就可以共享了。

根据帖子修复了我的问题。你只要替换

new Subject<any>();
然后,您可能需要处理未定义的内容,具体取决于您使用它的方式。
我知道这似乎有点老套,但很管用

刚刚根据帖子修正了我的问题。你只要替换

new Subject<any>();
然后,您可能需要处理未定义的内容,具体取决于您使用它的方式。
我知道这似乎有点老套,但很管用

我做了您让我做的更改,并将ngOnInit更改为this.dataSub=this.dataShareService.dataSource$.subscribe(post=>{console.log(post);});要测试但没有得到loggedits似乎。subscribe从未得到firedI认为您仍然有两个服务实例。你能给我们提供一个plunker让我们看到整个代码吗?比如,谁声明了这两个组件?在哪里提供服务,在哪些模块中?现在它不是第一次工作。如果我刷新列表页面并单击详细信息,它将不起作用。但如果我点击后退按钮并点击另一个列表项链接,它就会开始工作,直到我刷新应用程序。我在使用路由时遇到了完全相同的问题,如果我点击不同的组件,最终订阅就会触发。你解决过你的问题吗?我做了你让我做的更改,并将ngOnInit更改为this.dataSub=this.dataShareService.dataSource$.subscribe(post=>{console.log(post);});要测试但没有得到loggedits似乎。subscribe从未得到firedI认为您仍然有两个服务实例。你能给我们提供一个plunker让我们看到整个代码吗?比如,谁声明了这两个组件?在哪里提供服务,在哪些模块中?现在它不是第一次工作。如果我刷新列表页面并单击详细信息,它将不起作用。但如果我点击后退按钮并点击另一个列表项链接,它就会开始工作,直到我刷新应用程序。我在使用路由时遇到了完全相同的问题,如果我点击不同的组件,最终订阅就会触发。你解决过你的问题吗?我面临着类似的问题。我定义了一个公共RouterService,它被所有组件用于路由。现在我已经集成了AutGuard,它可以从SharedService传递布尔值-我面临着在RoutinService中导入DataSharingService的问题。不确定问题是什么。我面临着类似的问题。我定义了一个公共RouterService,它被所有组件用于路由。现在我已经集成了AutGuard,它可以从SharedService传递布尔值-我面临着在RoutinService中导入DataSharingService的问题。不知道问题是什么。
new Subject<any>();
new BehaviorSubject(undefined);