要实现Angular PWA和NGRX在离线情况下获取数据,您可以使用Service Worker来缓存数据,并在离线时从缓存中获取数据。以下是一个示例解决方案:
ng add @angular/pwa
这将安装必要的依赖项并将一些默认配置添加到您的Angular应用程序中。
npm install workbox-sw --save
service-worker.js
的文件,并在其中添加以下代码:importScripts('https://storage.googleapis.com/workbox-cdn/releases/6.1.5/workbox-sw.js');
workbox.routing.registerRoute(
new RegExp('.*'),
new workbox.strategies.NetworkFirst()
);
workbox.routing.registerRoute(
new RegExp('.*data\/.*\.json'),
new workbox.strategies.CacheFirst()
);
上述代码将使用NetworkFirst策略来处理除了"data/"目录之外的所有请求,并使用CacheFirst策略来处理"data/"目录下的请求。这意味着在离线时,您的应用程序将尝试从缓存中获取"data/"目录下的数据。
src/main.ts
文件中添加以下代码:import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { environment } from './environments/environment';
if (environment.production) {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(() => {
console.log('Service Worker registered');
})
.catch(error => {
console.error('Error registering Service Worker', error);
});
}
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
上述代码将在生产环境下注册Service Worker。
LoadData
的action,并在离线时从缓存中获取数据。在您的store文件中添加以下代码:import { createAction, props } from '@ngrx/store';
export const loadData = createAction('[Data] Load Data');
export const loadDataSuccess = createAction(
'[Data] Load Data Success',
props<{ data: any }>()
);
export const loadDataFailure = createAction(
'[Data] Load Data Failure',
props<{ error: any }>()
);
LoadData
action,并在离线时从缓存中获取数据。在您的effects文件中添加以下代码:import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { of } from 'rxjs';
import { catchError, map, mergeMap } from 'rxjs/operators';
import { loadData, loadDataSuccess, loadDataFailure } from './data.actions';
import { DataService } from './data.service';
@Injectable()
export class DataEffects {
loadData$ = createEffect(() =>
this.actions$.pipe(
ofType(loadData),
mergeMap(() =>
this.dataService.getData().pipe(
map((data: any) => loadDataSuccess({ data })),
catchError((error: any) => of(loadDataFailure({ error })))
)
)
)
);
constructor(
private actions$: Actions,
private dataService: DataService
) {}
}
上述代码将在离线时从DataService
获取数据,并在成功或失败时分别触发LoadDataSuccess
和LoadDataFailure
actions。
data.service.ts
文件中添加以下代码:import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class DataService {
private baseUrl = 'https://example.com/api';
constructor(private http: HttpClient) {}
getData(): Observable {
return this.http.get(`${