我有一個 Angular 路由決議器,其中包含在我的父路由加載時加載的專案串列,例如/users. 我已經實作了一個或多或少看起來像這樣的 Angular 決議器:
export class UsersResolver implements Resolve<UsersResponse> {
constructor(private usersService: UsersService) {}
resolve(): Observable<UsersResponse> {
return this.usersService.getUsers();
}
}
子組件以標準方式使用決議器資料:
this.route.data.subscribe((data) => {const users = data['users']} )
這很好......直到我執行任何可能更改該串列的操作(添加/洗掉/更改用戶)。在這種情況下,我希望該決議器重新運行。好吧,更具體地說,我希望決議器回傳的資料能夠反映更新后的資料。我不認為靜態選項會起作用,在我的情況下,runGuardsAndResolvers我也不認為使用你可以提供的功能runGuardsAndResolvers在我的情況下會起作用,因為這些資料更改可能不會與路由更改一起發生.
我想我想要的是這樣的:
export class UsersResolver implements Resolve<UsersResponse> {
constructor(private usersService: UsersService) {}
resolve(): Observable<UsersResponse> {
return this.usersService.users$;
}
}
...哪里this.usersService.users$是 rxjs Subject。這意味著我可以通過其他方式更新該主題,并且(我認為)決議器中的資料會更新,因此訂閱該決議器的任何子組件都會得到更新。但如果這是正確的,那么我在哪里觸發初始資料提取,以及如何確保我的決議器在初始資料提取完成之前不會真正決議?
這是一個合理解決方案的常見問題,還是我以錯誤的方式解決這個問題?
uj5u.com熱心網友回復:
Angular決議器只是在導航時提供資料,不應該做更多。
有很多方法可以使您的應用程式中的資料保持一致。
一種已知的方式是狀態管理(存盤),有許多庫,例如NgRx,它們提供了必要的工具來保持資料的一致性。
閱讀這篇關于狀態管理的文章了解更多細節。
另一種方法是構建您自己的簡單存盤概念,方法是創建一個傳播資料更改的單例服務。然后您可以訂閱并處理組件中的更改。
在您的用戶資料服務中:
data$: Observable<any>;
在你的組件中
data: any;
data$.subscribe(data => this.data = data);
其他組件中的其他地方
data$.next(data);
另一種方法是將您的資料存盤在單例存盤服務中,并直接從您的組件中訪問它。該服務將具有 update 和 get 方法來設定和更新服務中的資料。
uj5u.com熱心網友回復:
我認為您正在嘗試一些不可能的事情。我的意思resolver是,如果你triggered在route change事件發生后改變了那個可觀察的東西,resolver was completed你就不會在你的組件中得到那個資訊。
如果您想將該資訊與您的組件同步,我建議您訂閱或僅async pipe在您的組件中使用,而不是在您的resolver.
如果你仍然想擁有你的resolver,你可以合并兩個 observables 并處理你的變化component
uj5u.com熱心網友回復:
這是可能的,有點hacky。您可能只想在組件中注入 UsersService。
但沿著花園小徑:
我們回傳一個 observable 的 observable 并使用一個小技巧來確保第一次發射已經發生并且我們不會丟失這個第一個值。
resolve(): Observable<Observable<number[]>> {
const users$ = this.usersService.getUsers();
return users$.pipe(
take(1),
map((firstValue) => {
return users$.pipe(startWith(firstValue))
})
);
}
堆疊閃電戰
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/525105.html
上一篇:打字稿和地圖回傳錯誤資訊
