في البداية، يجب أن نشير إلى أن استخدام مكتبة RxJS في Angular يسهل علينا إدارة الحدث والاشتراك فيه، ولكن الحصول على القيمة الحالية لمتغير isLoggedIn
دون الاشتراك يمكن أن يكون تحديًا. في Angular، يتم التعامل مع قيم مثل هذه عادةً باستخدام Observables.
تجدر الإشارة إلى أنه في هذا السياق، يمكن أن تكون هناك عدة طرق للتعامل مع هذه الحالة، ولكننا سنركز على استخدام BehaviorSubject لتحقيق الهدف المطلوب.
لتحقيق هذا، يمكنك تعديل كود الخدمة SessionStorage
لاستخدام BehaviorSubject بدلاً من Subject. يمكن تحديث الكود كما يلي:
typescriptimport {Storage} from './storage';
import {Injectable} from 'angular2/core';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
@Injectable()
export class SessionStorage extends Storage {
private _isLoggedInSource = new BehaviorSubject<boolean>(/* initial value */ false);
isLoggedIn = this._isLoggedInSource.asObservable();
constructor() {
super('session');
}
setIsLoggedIn(value: boolean) {
this.setItem('_isLoggedIn', value, () => {
this._isLoggedInSource.next(value);
});
}
getCurrentLoggedInValue(): boolean {
return this._isLoggedInSource.value;
}
}
الآن، بعد تحديث الكود، يمكنك استخدام الدالة getCurrentLoggedInValue
للحصول على القيمة الحالية لـ isLoggedIn
بدون الاشتراك في Observable:
typescript// في مكان ما داخل الكومبوننت أو الخدمة الذي تحتاج فيه للقيمة الحالية
const currentLoggedInValue = sessionService.getCurrentLoggedInValue();
console.log(currentLoggedInValue);
يرجى مراعاة أن هذه الطريقة تقدم لك قيمة في اللحظة الحالية ولا تتابع التغييرات فيما بعد، ولذا إذا كنت بحاجة إلى متابعة التغييرات، سيكون من الأفضل الاشتراك في Observable كما كانت الحالة الأصلية.
المزيد من المعلومات
في هذا السياق، يُعد الاستعلام عن القيمة الحالية لمتغير “isLoggedIn” في خدمة Angular 2 الخاصة بك مهمة ضرورية. عندما تحتاج إلى الحصول على قيمة محددة لـ “isLoggedIn” من دون الحاجة إلى الاشتراك، يمكنك اللجوء إلى استخدام نهجين محتملين: النهج الأول يتعلق بتخزين القيمة في متغير محلي بمجرد حدوث تغيير في القيمة، بينما يشمل النهج الثاني استخدام BehaviorSubject من RxJS.
في البداية، يُفضل تجنب تخزين قيمة “isLoggedIn” في متغير محلي، حيث يمكن أن يؤدي ذلك إلى مشكلات محتملة في التحديث والتنسيق بين المكونات. بدلاً من ذلك، يمكنك استخدام BehaviorSubject الذي يوفر لك وسيلة للوصول إلى القيمة الحالية دون الحاجة إلى الاشتراك.
على سبيل المثال، يمكنك تحديث الخدمة الخاصة بك كما يلي:
typescriptimport { BehaviorSubject } from 'rxjs';
@Injectable()
export class SessionStorage extends Storage {
private _isLoggedInSource = new BehaviorSubject<boolean>(false);
isLoggedIn = this._isLoggedInSource.asObservable();
constructor() {
super('session');
}
setIsLoggedIn(value: boolean) {
this.setItem('_isLoggedIn', value, () => {
this._isLoggedInSource.next(value);
});
}
getCurrentValue(): boolean {
return this._isLoggedInSource.value;
}
}
باستخدام BehaviorSubject، يمكنك الآن استخدام الوظيفة “getCurrentValue” للوصول إلى القيمة الحالية لـ “isLoggedIn” دون الحاجة إلى الاشتراك. يمكنك ببساطة استدعاء هذه الوظيفة في المكون الذي يحتاج إلى القيمة الحالية.