一个 NGRX 商店,多个 Angular 应用程序
One NGRX store, multiple Angular Applications
所以我有点不喜欢这个。希望你能给我道歉。
我正在尝试将多个 Angular 元素(网络组件)插入 Prestashop 模块,即 PHP。由于没有一个包含许多模块的 Angular 应用程序,我无法使用商店将数据从一个元素发送到另一个元素。
我想过创建一个负责创建 NGRX 存储的库,并将其保存到 window.store(例如),这样同一个存储可以被多个独立的 angular 应用程序。这里的问题是我必须在许多 Angular 元素中调用库,所以我在构造函数中注入了不同的商店。我说的对吗?
例如:
import {
ActionReducer,
ActionReducerFactory,
ActionReducerMap,
ActionReducerMap,
ActionsSubject,
ReducerManager,
ReducerManagerDispatcher,
StateObservable,
Store,
} from '@ngrx/store'
import { Observable } from 'rxjs';
const storeName = 'store'
@Injectable({
providedIn: 'root'
})
export class StoreSyncService {
store: any = null
// option 1 constructor:
// are we, when including the library in others angular apps, instantiating store over and over?
constructor(private store: Store) {
if (window[storeName]) {
this.store = window[storeName]
} else{
window[storeName] = this.store
}
}
// option 2 constructor (please apologise me as I don't know how injection works very well).
// Any link to clarify this is welcome
constructor() {
if (window[storeName]) {
this.store = window[storeName]
} else{
const stateObservable$: StateObservable = new Observable()
const actionsObserver: ActionsSubject = new ActionsSubject()
const dispatcher: ReducerManagerDispatcher = new ActionsSubject()
const initialState = {}
const reducers: ActionReducerMap<any, any> = {}
const reducerFactory: ActionReducerFactory<any, any> = whatever
const reducerManager: ReducerManager = new ReducerManager(dispatcher, initialState, reducers, reducerFactory)
this.store = new Store(stateObservable$, actionsObserver, reducerManager)
window[storeName] = this.store
}
}
public getStore = () => this.store
public addReducer = (reducerName: string, reducer: ActionReducer<any>) => this.store.addReducer(reducerName, reducer)
public removeReducer = (reducerName: string) => this.store.removeReducer(reducerName)
}
回顾一下,如果我想在多个独立的 angular 应用程序之间共享状态,您会怎么做?
我尝试使用 localStorage,添加事件以将 NGRX 状态与本地存储中的数据同步,反之亦然,但结果有时是无限循环,有时是数据不同步的边缘情况。
感谢您的帮助和理解
所以现在,我找到了一种解决方法来避免商店的双重实例化。使用条件注入器。
import { Injectable, Injector } from '@angular/core';
...
constructor(private injector : Injector) {
if (window[storeName]) {
this.store = window[storeName]
} else{
this.store = this.injector.get<Store>(Store);
window[storeName] = this.store
}
}
我还没有测试它在独立应用程序之间共享数据。希望它能奏效。
随时欢迎任何建议!!
所以我有点不喜欢这个。希望你能给我道歉。
我正在尝试将多个 Angular 元素(网络组件)插入 Prestashop 模块,即 PHP。由于没有一个包含许多模块的 Angular 应用程序,我无法使用商店将数据从一个元素发送到另一个元素。
我想过创建一个负责创建 NGRX 存储的库,并将其保存到 window.store(例如),这样同一个存储可以被多个独立的 angular 应用程序。这里的问题是我必须在许多 Angular 元素中调用库,所以我在构造函数中注入了不同的商店。我说的对吗?
例如:
import {
ActionReducer,
ActionReducerFactory,
ActionReducerMap,
ActionReducerMap,
ActionsSubject,
ReducerManager,
ReducerManagerDispatcher,
StateObservable,
Store,
} from '@ngrx/store'
import { Observable } from 'rxjs';
const storeName = 'store'
@Injectable({
providedIn: 'root'
})
export class StoreSyncService {
store: any = null
// option 1 constructor:
// are we, when including the library in others angular apps, instantiating store over and over?
constructor(private store: Store) {
if (window[storeName]) {
this.store = window[storeName]
} else{
window[storeName] = this.store
}
}
// option 2 constructor (please apologise me as I don't know how injection works very well).
// Any link to clarify this is welcome
constructor() {
if (window[storeName]) {
this.store = window[storeName]
} else{
const stateObservable$: StateObservable = new Observable()
const actionsObserver: ActionsSubject = new ActionsSubject()
const dispatcher: ReducerManagerDispatcher = new ActionsSubject()
const initialState = {}
const reducers: ActionReducerMap<any, any> = {}
const reducerFactory: ActionReducerFactory<any, any> = whatever
const reducerManager: ReducerManager = new ReducerManager(dispatcher, initialState, reducers, reducerFactory)
this.store = new Store(stateObservable$, actionsObserver, reducerManager)
window[storeName] = this.store
}
}
public getStore = () => this.store
public addReducer = (reducerName: string, reducer: ActionReducer<any>) => this.store.addReducer(reducerName, reducer)
public removeReducer = (reducerName: string) => this.store.removeReducer(reducerName)
}
回顾一下,如果我想在多个独立的 angular 应用程序之间共享状态,您会怎么做?
我尝试使用 localStorage,添加事件以将 NGRX 状态与本地存储中的数据同步,反之亦然,但结果有时是无限循环,有时是数据不同步的边缘情况。
感谢您的帮助和理解
所以现在,我找到了一种解决方法来避免商店的双重实例化。使用条件注入器。
import { Injectable, Injector } from '@angular/core';
...
constructor(private injector : Injector) {
if (window[storeName]) {
this.store = window[storeName]
} else{
this.store = this.injector.get<Store>(Store);
window[storeName] = this.store
}
}
我还没有测试它在独立应用程序之间共享数据。希望它能奏效。
随时欢迎任何建议!!