Angular 2可观察订阅不会触发
我有一个订阅可观察不触发的问题.
我有一个使用侧面导航布局指令的布局,如下所示: <md-sidenav-layout class="nav-bar"> <md-sidenav #start> <nav> <a [routerLink]="['/home']">Home</a> </nav> <button md-button (click)="start.close()">Close</button> </md-sidenav> <router-outlet></router-outlet> </md-sidenav-layout> 我需要做的是从路由器插座显示的组件打开侧面导航. 一个这样的组件可能如下所示: @Component({ providers: [SidenavService,MdIconRegistry],directives: [MdIcon],templateUrl: `<md-icon (click)="toggleSidenav()">menu</md-icon>`,styleUrls: ["./home.component.scss"] }) export class Home { myColor: string; constructor(private sidenavService: SidenavService) { this.myColor = "primary"; this.sidenavService.getSidenavObs().subscribe(state => {console.log("state change")}); } toggleSidenav() { this.sidenavService.toggleSidenav("open"); } } 我创建了一个返回像这样的observable的服务: @Injectable() export class SidenavService { private toggle = new Subject<string>(); private toggleObs = this.toggle.asObservable(); getSidenavObs() { return this.toggleObs; } toggleSidenav(state: string) { this.toggle.next(state); } } 最后是父类的代码(属于侧面导航布局HTML): @Component({ providers: [MdSidenav,SidenavService],directives: [ROUTER_DIRECTIVES,MD_SIDENAV_DIRECTIVES,MD_BUTTON_DIRECTIVES],selector: "app",templateUrl: "app.html",styleUrls: ["./app.scss"],}) export class App { subscription: Subscription; constructor(private sidenavService: SidenavService,private sidenav: MdSidenav) { this.subscription = sidenavService.getSidenavObs().subscribe( status => { console.log("state change"); sidenav.open(); },error => { console.log(error); },() => { console.log("completed"); }); } } 现在我的问题是App组件中的订阅不会触发,但Home组件中的订阅(路由器插座显示的内容)会按预期触发. 我在这里错过了什么吗? 我按照本指南:https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
您的App和Home组件之间未共享相同的服务实例,因为您已将SidenavService列为两者的提供者.
在Component装饰器的providers条目中定义服务提供者时,该服务随后可用于该组件及其所有子级作为单例,这意味着将使用该服务的相同实例. 如果重新定义子组件中的提供程序,它将创建该服务的新实例,并且将不再与其父/祖先共享相同的服务实例. 如果您在App和Home组件中使用SidenavService并且需要相同的实例,则应仅在App组件中提供它并将其从Home的提供程序条目中删除. 有关DI的更多信息,请阅读以下链接: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |