在 Internet Explorer (IE) 中防止 Angular2 http 请求缓存的正确方法
Proper way to prevent Angular2 http request caching in internet explorer (IE)
当 IE 缓存 ajax 请求时,我遇到了一个众所周知的问题
在 JQuery 中我们有 $.ajaxSetup({ cache: false });
最常见的解决方案是根据每个请求更改 url...
但是这个问题有没有特定于angular2的解决方案?
使用 Angular2
和 asp.net core
Angular2 中没有对此的原生支持。这个需要你自己实现。
一种可能的方法是实现一个 HTTP 拦截器并在带有 URL 的请求已被执行时附加一个时间戳。
这是一个示例:
@Injectable()
export class CustomHttp extends Http {
urls: {string:string} = {};
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
if (this.urls[url]) {
options = options || {};
options.search = options.search || new URLSearchParams();
options.search.set('timestamp', (new Date()).getTime());
}
return super.get(url, options).do(() => {
this.urls[url] = true;
});
}
}
您可以这样注册CustomHttp
class:
bootstrap(AppComponent, [
HTTP_PROVIDERS,
provide(Http, {
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
})
]);
看到这个 plunkr:https://plnkr.co/edit/Nq6LPnYikvkgIQv4P5GM?p=preview。
Thierry 的解决方案可能是最好的,但如果您想要一种技术含量低、侵入性较小的方法,您可以编写一个函数,将时间戳参数附加到 URL..
效用-service.ts:
noCacheUrl( url: string): string{
const timestamp = "t=" + ((new Date()).getTime());
const prefix = ((url.indexOf("?") !== -1 ) ? "&" : "?");
return (url + prefix + timestamp);
}
... 我在应用程序设置文件中定义了我所有的 URL。因此,您可以使用 get 函数来检索 URL.. 该函数将 运行 'clean' [=37 上的 noCacheUrl 函数=]..
app-settings.ts:
import {UtilityService} from "../providers/utility-service";
@Injectable()
export class AppSettings {
private static _AUTH_URL = "http://myurl.com";
get AUTH_URL() {
return this.utilityService.noCacheUrl(AppSettings._AUTH_URL);
}
constructor(private utilityService: UtilityService) {
}
}
.. 然后要使用它,您只需将 AppSettings class 注入您的组件并使用 get 函数的名称请求 url。
export class MyComponent{
constructor(private appSettings: AppSettings) {
}
getData(){
const url = this.appSettings.AUTH_URL;
}
}
我看到的唯一缺点是您必须将 appSettings class 注入到您想要使用它的每个组件中,而对于常规静态常量则不需要。使用静态常量,我们失去了 运行 在 运行 处理数据的能力,因此存在交易。我想你可以在静态常量 class 中定义你的 URLs ,然后在你想使用它的时候调用 no-cache 函数..但这有点草率。
当 IE 缓存 ajax 请求时,我遇到了一个众所周知的问题
$.ajaxSetup({ cache: false });
最常见的解决方案是根据每个请求更改 url... 但是这个问题有没有特定于angular2的解决方案?
使用 Angular2
和 asp.net core
Angular2 中没有对此的原生支持。这个需要你自己实现。
一种可能的方法是实现一个 HTTP 拦截器并在带有 URL 的请求已被执行时附加一个时间戳。
这是一个示例:
@Injectable()
export class CustomHttp extends Http {
urls: {string:string} = {};
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
if (this.urls[url]) {
options = options || {};
options.search = options.search || new URLSearchParams();
options.search.set('timestamp', (new Date()).getTime());
}
return super.get(url, options).do(() => {
this.urls[url] = true;
});
}
}
您可以这样注册CustomHttp
class:
bootstrap(AppComponent, [
HTTP_PROVIDERS,
provide(Http, {
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
})
]);
看到这个 plunkr:https://plnkr.co/edit/Nq6LPnYikvkgIQv4P5GM?p=preview。
Thierry 的解决方案可能是最好的,但如果您想要一种技术含量低、侵入性较小的方法,您可以编写一个函数,将时间戳参数附加到 URL..
效用-service.ts:
noCacheUrl( url: string): string{
const timestamp = "t=" + ((new Date()).getTime());
const prefix = ((url.indexOf("?") !== -1 ) ? "&" : "?");
return (url + prefix + timestamp);
}
... 我在应用程序设置文件中定义了我所有的 URL。因此,您可以使用 get 函数来检索 URL.. 该函数将 运行 'clean' [=37 上的 noCacheUrl 函数=]..
app-settings.ts:
import {UtilityService} from "../providers/utility-service";
@Injectable()
export class AppSettings {
private static _AUTH_URL = "http://myurl.com";
get AUTH_URL() {
return this.utilityService.noCacheUrl(AppSettings._AUTH_URL);
}
constructor(private utilityService: UtilityService) {
}
}
.. 然后要使用它,您只需将 AppSettings class 注入您的组件并使用 get 函数的名称请求 url。
export class MyComponent{
constructor(private appSettings: AppSettings) {
}
getData(){
const url = this.appSettings.AUTH_URL;
}
}
我看到的唯一缺点是您必须将 appSettings class 注入到您想要使用它的每个组件中,而对于常规静态常量则不需要。使用静态常量,我们失去了 运行 在 运行 处理数据的能力,因此存在交易。我想你可以在静态常量 class 中定义你的 URLs ,然后在你想使用它的时候调用 no-cache 函数..但这有点草率。