如何定义具有observable的值?

时间:2018-04-11 20:00:58

标签: angular rxjs5

我想知道是否有办法在sessionStorage.getItem('currentuser')周围包装一个observable,因此调用代码只能在sessionStorage

中设置后才能订阅并获取值

这可能吗?

阿南德

1 个答案:

答案 0 :(得分:1)

当然可以。您可以通过服务

以这种方式解决它
import {Subject} from 'rxjs/Subject';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class StorageService {

    private storageAlert: Subject<any> = new Subject('');
    private propagationIsBlocked: false;

    // use this blocker for option 3
    blockPropagation(): void {
        propagationIsBlocked = true;
    }

    // use this unblocker for option 3
    unblockPropagation(): void {
        propagationIsBlocked = false;
    }

    // subscribe to this method in order to get updated whenever a change happens
    getValue(): Observable<any> {
        return this.storageAlert.asObservable();
    }

    // trigger the update << option1
    setValue(value: any) {
        if(value){
            this.sessionStorage.setItem('key', 'value');
            this.storageAlert.next(value);
       } 
    }

    // trigger the update << option2
    setValue(value: any) {
        if(value && value.id !== storageAlert.getValue().id){
            this.sessionStorage.setItem('key', 'value');
            this.storageAlert.next(value);
       }
    }

    // trigger the update << option3
    setValue(value: any) {
        if(!this.propagationIsBlocked){
            this.sessionStorage.setItem('key', 'value');
            this.storageAlert.next(value);
        }
    }
}

但老实说,如果您使用此服务,则不需要sessionStorage或localStorage,因为该值已存储在服务的变量“storageAlert”中。每个订阅实例都会因订阅而获得新值。