我想使用subject将数据发送到另一个组件(用于赚钱目的)。我无法取回数据。这是我的代码:
app.component.ts
import { Component } from '@angular/core';
import { shareService } from './share.service';
@Component({
selector: 'my-app',
template: `
<hello></hello>
<button (click)="passData()">
Start
</button>
`,
styleUrls: [ './app.component.css' ],
providers:[shareService]
})
export class AppComponent {
constructor(private service : shareService){}
passData(){
this.service.send("hello");
}
}
hello.component.ts
import { Component, Input } from '@angular/core';
import { shareService } from './share.service';
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'hello',
template: `<h1>Hello!</h1>`,
styles: [`h1 { font-family: Lato; }`],
providers:[shareService]
})
export class HelloComponent {
subscription: Subscription;
constructor(private share : shareService){
this.subscription = share.subj$.subscribe(val=>{
console.log(val);
})
}
}
share.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class shareService{
private sub = new Subject();
subj$ = this.sub.asObservable();
send(value: string) {
this.sub.next(value);
}
}
我没有在控制台中获得价值。
以下是工作演示:DEMO
答案 0 :(得分:5)
提出:
@Component({
.....
providers: [sharedService]
})
在两个组件中,您将创建共享服务的两个不同实例。 每个实例都不会意识到&#39;来自每个组件的数据。 在模块级别提供它并创建单件服务:
@NgModule({
....
providers: [sharedService]
})
这样,您将服务作为单个实例注入两个组件中,这样他们就可以共享它,因为它们将共享数据。
或使用Angular's preferred new way:
从Angular 6.0开始,这是创建单例的首选方法 service是指在服务上指定它应该提供的 应用程序根。这是通过将provideIn设置为root来完成的 服务的@Injectable装饰者:
@Injectable({
providedIn: 'root',
})
请参阅also
答案 1 :(得分:0)
我不知道为什么使用sub $但你不需要那个
// just push data to subject. you can use BehavourSubject to initiatte a value.
@Injectable()
export class shareService{
private sub = new Subject();
confirmMission(astronaut: string) {
this.sub.next(astronaut);
}
}
然后在你的第二个组件中写下它
@Component({
selector: 'hello',
template: `<h1>Hello!</h1>`,
styles: [`h1 { font-family: Lato; }`],
providers:[shareService] // this can be shared in module lebel or componenet level
})
export class HelloComponent {
subscription: Subscription;
constructor(private share : shareService){
this.subscription = share.subj.subscribe(val=>{
console.log(val);
})
}
}
确保以模块级别提供服务或在组件中提供服务。