通过服务角度2在组件之间传递用户定义的数字

Posted

技术标签:

【中文标题】通过服务角度2在组件之间传递用户定义的数字【英文标题】:Passing a user defined number between component through service angular 2 【发布时间】:2017-12-11 15:07:34 【问题描述】:

example.service.ts

import  Injectable  from '@angular/core';

@Injectable()
export class ExampleService 

    number1 : number;
    number2 : number;
    result : number;
    constructor()  


component1.component.ts

import  Component, OnInit  from '@angular/core';
import  ExampleService  from '../example.service'

@Component(
    selector: 'app-component1',
    templateUrl: './component1.component.html',
    styleUrls: ['./component1.component.css'],
    providers: [ExampleService]
)
export class Component1Component implements OnInit 

    number1v = null;
    number2v = null;
    resultv = null;

    constructor(public aService : ExampleService )  
        this.aService.number1 = this.number1v;
        this.aService.number2 = this.number2v;
        this.aService.result = this.resultv;
    
    ngOnInit() 
    
    processForm()
    this.resultv = this.number1v + this.number2v;
    

component2.component.ts

import  Component, OnInit  from '@angular/core';
import  ExampleService  from '../example.service'

@Component(
    selector: 'app-component2',
    templateUrl: './component2.component.html',
    styleUrls: ['./component2.component.css'],
    providers: [ExampleService]
)
export class Component2Component implements OnInit 
    resultv;
    constructor(public aService : ExampleService)  
        this.aService.result = this.resultv;
    

    ngOnInit() 
    
    getResult()
        alert(this.resultv)
    

想要将结果值从组件 1 传递给组件 2。

没有父到子或子到父组件。

我得到的结果是未定义的。

【问题讨论】:

使用这个blog post Angular - shared service between components doesn't work的可能重复 【参考方案1】:

问题在于,当组件 A 更新服务时,组件 B 不知道这些更改。所以,为了解决这个问题,我们需要使用观察者模式,让所有观察者都知道变化。

幸运的是 Angular 自带了 rxjs,所以我们可以使用BehaviorSubject 来实现观察者模式。

服务代码

import  Injectable  from '@angular/core';

@Injectable()
export class ExampleService 

    number1 = new BehaviorSubject<number>(0);
    number2 = new BehaviorSubject<number>(0);
    result = new BehaviorSubject<number>(0);
    constructor()  


在组件内部你可以读取它们的值

service.number1.subscribe(num => 
   // ....
);

要更改任何数字,您可以通过这种方式更新它

service.number1.next(1); // set new number 

当然这是粗略的方式,您可以通过阅读在线教程或 BehaaviorSubject 上的答案获得更好的示例

【讨论】:

以上是关于通过服务角度2在组件之间传递用户定义的数字的主要内容,如果未能解决你的问题,请参考以下文章

通过输入和输出在组件之间传递数据

在角度组件之间传递参数不起作用

通过服务在指令/组件之间传递数据

如何以角度在兄弟组件之间共享数据?

Angular 8:通过本地服务在单独模块中的组件之间传递数据

父子组件之间的通信