Angular BehaviorSubject在延迟加载的模块内不断重置
我正在尝试为延迟加载的模块实现一个Angular BehaviorSubject在延迟加载的模块内不断重置,angular,rxjs,angular6,facade,Angular,Rxjs,Angular6,Facade,我正在尝试为延迟加载的模块实现一个facade.service 闪电战 门面 @Injectable() export class TaFacadeService { private _state: TAState; private _store: BehaviorSubject<TAState>; private _state$: Observable<TAState>; ano$: Observable<number>; loadi
facade.service
闪电战
门面
@Injectable()
export class TaFacadeService {
private _state: TAState;
private _store: BehaviorSubject<TAState>;
private _state$: Observable<TAState>;
ano$: Observable<number>;
loading$: Observable<boolean>;
mes$: Observable<number>;
tarjetas$: Observable<DatoListaAmarilla[]>;
url$: Observable<string>;
rutaSubscription: Subscription;
codUser: string;
urlEp: any;
/**
* Viewmodel que computa el estado completo una vez que esta listo
* o es actualizado
*/
vm$: Observable<TAState> = combineLatest(
this.ano$,
this.loading$,
this.mes$,
this.tarjetas$,
this.url$
).pipe(
map(([ano, loading, mes, tarjetas, url]) => {
return { ano, loading, mes, tarjetas, url };
})
);
/**
* Vigilar 2 streams para desencadenar la busqueda de las tarjetas
* y el update del state
*/
constructor(private http: HttpClient, private authService: AuthService) {
console.log(`// ----------------------- //`);
console.log(`Facade Service Instanciated`);
console.log(`// ----------------------- //`);
this._state = {
ano: new Date().getFullYear(),
loading: false,
mes: new Date().getMonth() + 1,
tarjetas: [],
url: ""
};
this.urlEp = {
emitidas: "Emitida",
recibidas: "Recibida",
prevencion: "Prevencion",
zonal: "JefeZonal",
comite: "Comite",
detalle: "Detalle",
persona: "Todos",
ejecutor: "Ejecutor",
ver: "Todos"
};
this._store = new BehaviorSubject<TAState>(this._state);
this._state$ = this._store.asObservable();
this.ano$ = this._state$.pipe(
map(state => state.ano),
tap(state => console.log(`Ano es: ${state}`)),
distinctUntilChanged()
);
this.loading$ = this._state$.pipe(
map(state => state.loading),
tap(state => console.log(`Loading es: ${state}`)),
distinctUntilChanged()
);
this.mes$ = this._state$.pipe(
map(state => state.mes),
tap(state => console.log(`Mes es: ${state}`)),
distinctUntilChanged()
);
this.tarjetas$ = this._state$.pipe(
map(state => state.tarjetas),
tap(state => console.log(`tarjetas es:`, state)),
distinctUntilChanged()
);
this.url$ = this._state$.pipe(
map(state => state.url),
tap(state => console.log(`url$ es: ${state}`)),
distinctUntilChanged()
);
this.codUser = this.authService.user;
combineLatest(this.ano$, this.mes$, this.url$)
.pipe(
switchMap(([ano, mes, url]) => {
if (!url) {
console.log(`url es desde switchmap: ${url}`);
return of(null);
}
return this.getTarjetasAmarillas(url, ano, mes);
})
)
.subscribe(tarjetas => {
console.log(`tarjetas del subscribe es:`, tarjetas);
this.updateState({ ...this._state, tarjetas, loading: false });
});
}
getStateSnapshop(): TAState {
return { ...this._state };
}
buildSerchControls(): FormGroup {
const form = new FormGroup({
ano: new FormControl("", Validators.required),
mes: new FormControl("", Validators.required)
});
form
.get("ano")
.valueChanges.pipe(
debounceTime(300),
distinctUntilChanged()
)
.subscribe(ano => this.updateAno(ano));
form
.get("mes")
.valueChanges.pipe(
debounceTime(300),
distinctUntilChanged()
)
.subscribe(mes => this.updateMes(mes));
return form;
}
buildUrl(userCod: string, tipo: string, ano: number, mes?: number) {
const URL = "SOMEURL";
const tipoTA = tipo;
// // var urlFull = this.url + "TaLista?Tipo=Todos&Cod=" + Año + ":" + Mes;
const u = `${URL}TaLista?Tipo=${tipoTA}&Cod=`;
// const user = this.authService.user;
if (tipoTA === "JefeZonal") {
return `${u}${ano}:${mes}:${userCod}`;
} else if (
tipoTA === "Prevencion" ||
tipoTA === "Comite" ||
tipoTA === "Todos"
) {
return `${u}${ano}:${mes}`;
} else if (tipoTA === "Detalle") {
return `${u}${ano}`;
} else {
return `${u}${userCod}:${ano}:${mes}`;
}
}
updateMes(mes: number) {
this.updateState({ ...this._state, mes, loading: true });
}
updateAno(ano: number) {
this.updateState({ ...this._state, ano, loading: true });
}
updateUrl(url: string) {
console.log(`updating url... new url is ${url}`);
this.updateState({ ...this._state, url: this.urlEp[url], loading: true });
}
// --------------------- Private Methods ------------------------
private updateState(state: TAState) {
this._store.next(state);
}
/**
* Obtener tarjetas amarillas segun ano y mes
*/
getTarjetasAmarillas(url: string, ano: number, mes?: number) {
const httpUrl = this.buildUrl(this.codUser, url, ano, mes);
console.log(`url es: ${httpUrl}`);
return this.http.get<DatoListaAmarilla[]>(httpUrl);
}
}
@Injectable()
出口级TaFacadeService{
私人州:塔斯塔特;
私人商店:行为主体;
私有_状态$:可观察;
ano$:可观察的;
加载$:可观察;
mes$:可观察的;
tarjetas$:可观察;
url$:可观察的;
ruta订阅:订阅;
密码用户:字符串;
urlEp:任何;
/**
*Viewmodel que computa el estado completo una vez que esta listo
*我是扎多
*/
vm$:可观察=组合相关测试(
这个,这个,,
这是。正在加载$,
这个.mes$,
这是tarjetas$,
这个网址$
).烟斗(
地图(([ano,加载,mes,tarjetas,url])=>{
返回{ano,loading,mes,tarjetas,url};
})
);
/**
*塔吉塔斯布斯克达附近的2条溪流
*更新状态
*/
构造函数(私有http:HttpClient,私有authService:authService){
console.log(`/--------------------------/`);
log(`Facade Service instanced`);
console.log(`/--------------------------/`);
此状态={
否:新日期().getFullYear(),
加载:false,
mes:新日期().getMonth()+1,
tarjetas:[],
网址:“
};
this.urlEp={
艾米蒂达斯:“艾米蒂达斯”,
累西比达:“累西比达”,
预防:“预防”,
地带性:“JefeZonal”,
comite:“comite”,
德塔利:“德塔利”,
人物角色:“待办事项”,
ejector:“ejector”,
版本:“待办事项”
};
this.\u store=新行为主体(this.\u状态);
this.\u state$=this.\u store.asObservable();
this.ano$=this.\u state$.pipe(
映射(state=>state.ano),
轻触(state=>console.log(`Ano es:${state}`)),
distinctUntilChanged()
);
this.loading$=this.\u state$.pipe(
映射(state=>state.loading),
点击(state=>console.log(`Loading es:${state}`)),
distinctUntilChanged()
);
this.mes$=this.\u state$.pipe(
映射(state=>state.mes),
点击(state=>console.log(`meses:${state}`)),
distinctUntilChanged()
);
this.tarjetas$=this.\u state$.pipe(
映射(state=>state.tarjetas),
点击(state=>console.log(`tarjetases:`,state)),
distinctUntilChanged()
);
this.url$=this.\u state$.pipe(
映射(state=>state.url),
轻触(state=>console.log(`url$es:${state}`)),
distinctUntilChanged()
);
this.codUser=this.authService.user;
CombineTest(this.ano$、this.mes$、this.url$)
.烟斗(
开关映射([ano、mes、url])=>{
如果(!url){
log(`url-es-desde-switchmap:${url}`);
返回(空);
}
返回这个.getTarjetasAmarillas(url、ano、mes);
})
)
.订阅(tarjetas=>{
log(`tarjetas del subscribe:`,tarjetas);
this.updateState({…this.\u state,tarjetas,load:false});
});
}
getStateSnapshop():TAState{
返回{…this.\u state};
}
buildSerchControls():FormGroup{
const form=new FormGroup({
ano:新FormControl(“,需要验证程序),
mes:新FormControl(“,验证器。必需)
});
形式
.get(“ano”)
.水管(
去BounceTime(300),
distinctUntilChanged()
)
.subscribe(ano=>this.updateAno(ano));
形式
.get(“mes”)
.水管(
去BounceTime(300),
distinctUntilChanged()
)
.subscribe(mes=>this.updateMes(mes));
申报表;
}
buildUrl(userCod:string、tipo:string、ano:number、mes?:number){
const URL=“SOMEURL”;
const tipoTA=tipo;
////var urlFull=this.url+“TaLista?Tipo=Todos&Cod=“+Año+”:“+Mes;
const u=`${URL}TaLista?Tipo=${tipoTA}&Cod=`;
//const user=this.authService.user;
如果(蒂波塔==“杰菲佐纳尔”){
返回`${u}${ano}:${mes}:${userCod}`;
}否则如果(
蒂波塔==“预测”||
蒂波塔==“委员会”||
蒂波塔==“待办事项”
) {
返回`${u}${ano}:${mes}`;
}否则如果(蒂波塔==“德塔莱”){
返回`${u}${ano}`;
}否则{
返回`${u}${userCod}:${ano}:${mes}`;
}
}
更新项(mes:编号){
this.updateState({…this.\u state,mes,load:true});
}
updateAno(ano:number){
this.updateState({…this.\u state,ano,load:true});
}
updateUrl(url:string){
log(`更新url…新url为${url}`);
this.updateState({…this.\u state,url:this.urlEp[url],loading:true});
}
//--------------私有方法------------------------
私人地产(州:TAState){
此._存储。下一个(状态);
}
/**
*阿马里拉酒店
*/
getTarjetasAmarillas(url:string,ano:number,mes?:number){
const httpUrl=this.buildUrl(this.codUser,url,ano,mes);
log(`url es:${httpUrl}`);
返回此.http.get(httpUrl);
}
}
此服务跟踪所有可观察对象,并创建表单
,并将其发送给包含搜索词的子组件
应用程序结构
一个根app.module
,一个core.module
注入到app模块中,在shared.module
上,根据需要导入到不同的地方,4个同级延迟加载模块,其中一个是我尝试实现此外观的地方
这一切都是从我看到
我试过了
@NgModule
提供程序数组中李>
将其注入核心@NgModule
其中位于文件夹结构中
此服务存在于src/app/core/services中,它导出到桶index.ts
文件中
chrome的devtool co.的一些输出