如何更新angular2中的全局变量

时间:2017-10-30 14:48:10

标签: angular

使用angular2。对于全局变量访问,我创建一个服务并注入我的组件页面。

我可以在任何页面上访问它,但是当我更新该变量时,更改在其他页面访问时不会受到影响。

这是GlobaldataService中的代码



import { Injectable } from '@angular/core';

@Injectable()
export class GlobaldataService {

  public var1="haii";
}



 这是我使用的服务。


constructor(public obj: GlobaldataService){}




在我的一个组件页面中,我通过this.obj.var1 =&#34更新变量;你好&#34 ;;

在另一个页面组件警报(this.obj.var1);但它显示了较旧的价值,即" haii"如何更新全局变量。

提前致谢

2 个答案:

答案 0 :(得分:4)

你想要的是一个信使服务。它保留了一个全局变量并为您的组件提供了Observable订阅以及更新和广播新值的方法:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject ';
import { Observable } from 'rxjs/Observable ';

@Injectable()
export class MessengerService {

    private messageSource: BehaviorSubject<string> = new BehaviorSubject('initialValue'); 
    public message = this.messageSource.asObservable();

    public setMessage(value: string) {
        this.messageSource.next(value);
    }
}

在您的组件中,您只需订阅该值并进行更新即可:

import { Subscription } from 'rxjs/BehaviorSubject ';

export class ViewComponent implements OnInit, OnDestroy {

    private messageSubscription: Subscription;

    constructor(private messengerService: MessengerService) { }

    ngOnInit() {
        this.messageSubscription = this.messengerService.message.subscribe(m => {
            // Do something with your value
        });
    }

    ngOnDestroy() {
        this.messageSubscription.unsubscribe();
    }

    setGlobalValue(value: string) {
        // All components that are subscribed to the
        // messenger service receive the update
        this.messengerService.setMessage(value);
    }
}

答案 1 :(得分:0)

如果其他组件和服务从您的服务中读取var1,则会创建该值的副本。如果您稍后更新了源,则其他人不会收到有关更改源的通知。他们都需要重新阅读全球服务的价值。

如果var1的值是对象而不是字符串,并且您不替换对象但只修改对象的属性,则组件和服务可能会获得更新的值。

字符串,数字和布尔值等原始值按值复制,而对象则通过引用复制。

更好的选择是使用允许感兴趣的组件和服务订阅更改的Observable(主动获得有关更新的通知)。

http://angular.io中的教程和许多在线教程展示了如何使用observable。