Angular 2可观察订阅不会触发

前端之家收集整理的这篇文章主要介绍了Angular 2可观察订阅不会触发前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个订阅可观察不触发的问题.

我有一个使用侧面导航布局指令的布局,如下所示:

  1. <md-sidenav-layout class="nav-bar">
  2.  
  3.  
  4. <md-sidenav #start>
  5. <nav>
  6. <a [routerLink]="['/home']">Home</a>
  7. </nav>
  8. <button md-button (click)="start.close()">Close</button>
  9. </md-sidenav>
  10.  
  11. <router-outlet></router-outlet>
  12.  
  13. </md-sidenav-layout>

我需要做的是从路由器插座显示的组件打开侧面导航.

一个这样的组件可能如下所示:

  1. @Component({
  2.  
  3. providers: [SidenavService,MdIconRegistry],directives: [MdIcon],templateUrl: `<md-icon (click)="toggleSidenav()">menu</md-icon>`,styleUrls: ["./home.component.scss"]
  4. })
  5.  
  6. export class Home {
  7.  
  8. myColor: string;
  9.  
  10. constructor(private sidenavService: SidenavService) {
  11. this.myColor = "primary";
  12.  
  13. this.sidenavService.getSidenavObs().subscribe(state => {console.log("state change")});
  14. }
  15.  
  16.  
  17. toggleSidenav() {
  18.  
  19. this.sidenavService.toggleSidenav("open");
  20. }
  21.  
  22. }

我创建了一个返回像这样的observable的服务:

  1. @Injectable()
  2. export class SidenavService {
  3.  
  4. private toggle = new Subject<string>();
  5. private toggleObs = this.toggle.asObservable();
  6.  
  7. getSidenavObs() {
  8. return this.toggleObs;
  9. }
  10.  
  11. toggleSidenav(state: string) {
  12. this.toggle.next(state);
  13. }
  14.  
  15. }

最后是父类代码(属于侧面导航布局HTML):

  1. @Component({
  2. providers: [MdSidenav,SidenavService],directives: [ROUTER_DIRECTIVES,MD_SIDENAV_DIRECTIVES,MD_BUTTON_DIRECTIVES],selector: "app",templateUrl: "app.html",styleUrls: ["./app.scss"],})
  3.  
  4. export class App {
  5.  
  6. subscription: Subscription;
  7.  
  8. constructor(private sidenavService: SidenavService,private sidenav: MdSidenav) {
  9. this.subscription = sidenavService.getSidenavObs().subscribe( status => {
  10. console.log("state change");
  11. sidenav.open();
  12. },error => {
  13. console.log(error);
  14. },() => {
  15. console.log("completed");
  16. });
  17. }
  18. }

现在我的问题是App组件中的订阅不会触发,但Home组件中的订阅(路由器插座显示内容)会按预期触发.

我在这里错过了什么吗?

我按照本指南:@L_403_0@

您的App和Home组件之间未共享相同的服务实例,因为您已将SidenavService列为两者的提供者.

在Component装饰器的providers条目中定义服务提供者时,该服务随后可用于该组件及其所有子级作为单例,这意味着将使用该服务的相同实例.

如果重新定义子组件中的提供程序,它将创建该服务的新实例,并且将不再与其父/祖先共享相同的服务实例.

如果您在App和Home组件中使用SidenavService并且需要相同的实例,则应仅在App组件中提供它并将其从Home的提供程序条目中删除.

有关DI的更多信息,请阅读以下链接
https://angular.io/docs/ts/latest/guide/dependency-injection.html
https://angular.io/docs/ts/latest/guide/hierarchical-dependency-injection.html

猜你在找的Angularjs相关文章