【发布时间】:2019-11-25 20:12:08
【问题描述】:
我有一个按钮,用于更新组件的参数。这在我点击按钮时有效,更新参数。有时,当我刷新页面或通过外部页面的 URL 导航到它时,更新逻辑不起作用。
我知道这是因为 behaviorSubject 被硬编码为 (2019,1,1,'Stores'),如下所示。为什么作者把它放进去我不确定。我所知道的是,刷新时不需要带有(2019,1,1,'Stores') 的对象。我有一个方法getSLGCurrentWeek() 也如下所示,它应该将(2019,1,1,'Stores') 更新为当前年份、季度和周。现在是 2020 年,1,4。
为什么当我尝试重置它时会显示该硬编码值?或者更好的是从http请求getSLGCurrentWeek()获取正确值的最佳方法是什么,以便我可以在getSLGData(params)方法中使用这些值?
export class SlgService {
private slgParamsSource: Subject<SLGReportParams> = new BehaviorSubject<SLGReportParams>(new SLGReportParams(2019, 1, 1, 'Stores'));
slgParams = this.slgParamsSource.asObservable();
constructor(private http: HttpClient, @Inject('BASE_URL') private baseUrl: string) { }
getSLGData(params: SLGReportParams) {
var slgParams = '?year=' + params.Year + '&quarter=' + params.Quarter + '&week=' + params.Week + '&dept=' + params.Dept;
return this.http.get(this.baseUrl + 'api/slg/slg' + slgParams);
}
getSLGCurrentWeek() {
return this.http.get(this.baseUrl + 'api/slg/SlgCurrentWeek');
}
getSLGWeeks() {
return this.http.get<any[]>(this.baseUrl + 'api/slg/slgGetAllWeeks');
}
updateSLGParams(params: SLGReportParams) {
this.slgParamsSource.next(params);
}
}
这是我的 ngOnInit()
ngOnInit() {
console.log("here")
this.slgForm = new FormGroup({
year: new FormControl(),
quarter: new FormControl(),
week: new FormControl(),
dept: new FormControl()
})
console.log(this.slgForm)
//subscribe to slg Service params observable
this.slgService.slgParams.subscribe(data => {
this.slgParams = data;
this.getData(this.slgParams);
})
this.slgService.getSLGCurrentWeek().subscribe((data: any) => {
//set SlgForm with current week values.
this.slgForm.patchValue({
year: data.year,
week: data.week,
quarter: data.quarter
})
this.slgParams = new SLGReportParams(this.slgForm.value.year, this.slgForm.value.quarter, this.slgForm.value.week, this.slgForm.value.dept);
this.slgService.updateSLGParams(this.slgParams);
//this.populateSLGTotals();
//this.operations(data);
this.getData(this.slgParams)
//update service with params // Submit has been taken out here
},
error => console.log(error),
)
}
更新按钮
submit() {
this.slgParams = new SLGReportParams(this.slgForm.value.year, this.slgForm.value.quarter, this.slgForm.value.week, this.slgForm.value.dept);
this.slgService.updateSLGParams(this.slgParams);
console.log("I have submitted")
}
总之。如何在不受 BehaviorSubject (2019,1,1,'Stores') 影响的情况下运行 this.slgService.getSLGCurrentWeek() 以将参数放入 this.slgService.getSLGData(params)?
感谢您的帮助。
【问题讨论】:
-
感谢您的所有回答和 cmets。我正在努力阅读所有这些以更正我的代码。我会在阅读完所有这些后通知您。谢谢你,很快就会回来。再次感谢!
-
感谢您的意见。将我的 BehaviorSubject 更改为私有 slgParamsSource:ReplaySubject
= new ReplaySubject (null);现在它没有被重置。我尝试对具有空值的 BehaviorSubject 执行相同的操作,但没有成功。你知道为什么这会奏效吗?我正在阅读很多关于 replaySubject 和 behaviorSubject 之间的区别,但奇怪的是返回多个回调的东西会解决这个问题。我很困惑为什么它现在有效。我也问过下面的其他人。有人解开这个谜团吗? -
还有什么理由让 ReplaySubject
= new ReplaySubject (null) 可以在调试模式而不是生产模式下工作?我刚刚发布后出现错误,不得不恢复。
标签: javascript angular rxjs observable behaviorsubject