订阅方法不对更改做出反应 [Angular 2]
Subscribe method don't react to changes [Angular 2]
我的 app.component 中有方法可以更改 LangService 中的语言。当更改发生时,LangService 应该用 Observable 对象响应我所有其他组件,因为我已经订阅了我所有组件的更改。不幸的是,这没有发生。它只响应调用更改语言函数的app.component。我不确定我在哪里犯了错误。也许我只是误解了整个概念,因为我是 Angular 的新手。
代码如下:
app.component.html
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">
{{ title }}
</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right">
<ol class="breadcrumb">
<li *ngFor="let lang of langs">
<a (click)="changeLanguage(lang)">
{{ lang }}
</a>
</li>
</ol>
</ul>
</div>
</div>
</nav>
<router-outlet></router-outlet>
app.component.ts
import { Component } from '@angular/core';
import './rxjs-operators';
import { ROUTER_DIRECTIVES } from '@angular/router';
import { LangService } from './lang.service';
import { NotesComponent } from './notes/notes.component';
@Component({
moduleId: module.id,
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css'],
directives: [NotesComponent, ROUTER_DIRECTIVES],
providers: [LangService]
})
export class AppComponent {
title = " Note App for BSC-Ideas";
langs :Array<string> = ['EN', 'CZ'];
constructor(
private _langService :LangService
) {
this._langService.activeLang$.subscribe(
success => console.log('done') // It works here
);
}
changeLanguage(lang :string) :void{
this._langService.changeLanguage(lang);
}
}
一些other.component.ts
import { Component, OnInit } from '@angular/core';
import { LangService } from '../lang.service';
@Component({
moduleId: module.id,
selector: 'all-notes',
templateUrl: 'notes.component.html',
providers: [NoteService, LangService]
})
export class NotesComponent implements OnInit {
mode = 'Observable';
constructor(private _langService :LangService) {}
ngOnInit() {
this.updatePhrases(this.postPhrases);
this._langService.getUpdates().subscribe(
success => console.log('is working') //Doesn't work here
);
}
}
语言服务
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class LangService {
activeLang = 'EN';
private activeLangSubject = new Subject<string>();
activeLang$ = this.activeLangSubject.asObservable();
getUpdates() :Observable<Object>{
return this.activeLang$.map(
response => response || {}
);
}
changeLanguage(lang :string){
if(lang == 'EN' || lang == 'CZ'){
this.activeLang = lang;
this.activeLangSubject.next(lang);
}
}
}
感谢您的帮助。
如果您在每个组件上提供 LangService
,每个组件将获得自己的实例。
而是只在根组件中提供一次或 bootstrap(AppComponent, [LangService])
如果你使用 RC.5
将它添加到 @NgModule()
的 providers: [LangService]
那么它将自动成为一个全局服务(除非它是一个延迟加载的模块,那么你需要使用forRoot()
)
我认为您需要在所有组件中共享 LangService
的实例。为此,仅在顶级组件中提供 LangService
。在你的情况下可能 app.component.ts
您可以通过 this 文章详细了解依赖注入和提供程序。
我的 app.component 中有方法可以更改 LangService 中的语言。当更改发生时,LangService 应该用 Observable 对象响应我所有其他组件,因为我已经订阅了我所有组件的更改。不幸的是,这没有发生。它只响应调用更改语言函数的app.component。我不确定我在哪里犯了错误。也许我只是误解了整个概念,因为我是 Angular 的新手。
代码如下:
app.component.html
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">
{{ title }}
</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right">
<ol class="breadcrumb">
<li *ngFor="let lang of langs">
<a (click)="changeLanguage(lang)">
{{ lang }}
</a>
</li>
</ol>
</ul>
</div>
</div>
</nav>
<router-outlet></router-outlet>
app.component.ts
import { Component } from '@angular/core';
import './rxjs-operators';
import { ROUTER_DIRECTIVES } from '@angular/router';
import { LangService } from './lang.service';
import { NotesComponent } from './notes/notes.component';
@Component({
moduleId: module.id,
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css'],
directives: [NotesComponent, ROUTER_DIRECTIVES],
providers: [LangService]
})
export class AppComponent {
title = " Note App for BSC-Ideas";
langs :Array<string> = ['EN', 'CZ'];
constructor(
private _langService :LangService
) {
this._langService.activeLang$.subscribe(
success => console.log('done') // It works here
);
}
changeLanguage(lang :string) :void{
this._langService.changeLanguage(lang);
}
}
一些other.component.ts
import { Component, OnInit } from '@angular/core';
import { LangService } from '../lang.service';
@Component({
moduleId: module.id,
selector: 'all-notes',
templateUrl: 'notes.component.html',
providers: [NoteService, LangService]
})
export class NotesComponent implements OnInit {
mode = 'Observable';
constructor(private _langService :LangService) {}
ngOnInit() {
this.updatePhrases(this.postPhrases);
this._langService.getUpdates().subscribe(
success => console.log('is working') //Doesn't work here
);
}
}
语言服务
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class LangService {
activeLang = 'EN';
private activeLangSubject = new Subject<string>();
activeLang$ = this.activeLangSubject.asObservable();
getUpdates() :Observable<Object>{
return this.activeLang$.map(
response => response || {}
);
}
changeLanguage(lang :string){
if(lang == 'EN' || lang == 'CZ'){
this.activeLang = lang;
this.activeLangSubject.next(lang);
}
}
}
感谢您的帮助。
如果您在每个组件上提供 LangService
,每个组件将获得自己的实例。
而是只在根组件中提供一次或 bootstrap(AppComponent, [LangService])
如果你使用 RC.5
将它添加到 @NgModule()
的 providers: [LangService]
那么它将自动成为一个全局服务(除非它是一个延迟加载的模块,那么你需要使用forRoot()
)
我认为您需要在所有组件中共享 LangService
的实例。为此,仅在顶级组件中提供 LangService
。在你的情况下可能 app.component.ts
您可以通过 this 文章详细了解依赖注入和提供程序。