我希望能够在我的单页应用(Angular项目)中使用路由来检测页面刷新。
是否有其他替代方法?
在 component.ts 文件中:
import { Subscription } from 'rxjs';
export let browserRefresh = false;
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnDestroy {
subscription: Subscription;
constructor(private router: Router) {
this.subscription = router.events.subscribe((event) => {
if (event instanceof NavigationStart) {
browserRefresh = !router.navigated;
}
});
}
在您需要的页面上:
import { browserRefresh } from '../app.component';
....
ngOnInit() {
this.browserRefresh = browserRefresh;
console.log('refreshed?:', browserRefresh);
}
在 https://stackblitz.com/edit/refreshangular?file=src%2Fapp%2Fpage-a%2Fpage-a.component.ts 查看一个工作示例。
点击页面A和页面B,刷新以查看差异。
试试这个:
this.router.events
.pipe(filter((rs): rs is NavigationEnd => rs instanceof NavigationEnd))
.subscribe(event => {
if (
event.id === 1 &&
event.url === event.urlAfterRedirects
) {
// Your code here for when the page is refreshd
}
})
你需要导入
import { filter } from 'rxjs/operators'
import { Router } from '@angular/router';
import { filter } from 'rxjs/operators'
。 - DeadlyChambersimport { filter } from 'rxjs/operators';
。 - Ghoul Ahmed在 Angular 7 及更高版本中,最新的方法是我们现在可以添加路由导航属性。
因此,如果 /somepage
是我们想要检测的页面,并且如果浏览器被刷新,当我们进入此页面时,我们设置 navigate 属性 prevPage:
this.router.navigate(['/somepage'], { state: { prevPage: this.router.url } });
然后在somepage内部:
ngOnInit(): void {
const previousUrl = history.state.prevPage ?? null;
if (!this.previousUrl) {
console.log('page was refreshed!');
} else {
console.log('I came here from: ', previousUrl);
}
}
注意:如果您想检测特定页面的浏览器刷新,则此方法有效。
如果您需要在整个网站中使用此功能,则建议采用不同的方法。
我希望能够通过路由检测页面刷新
您可以向路由器添加一个顶级解析器。如果您只有一个顶级路由器,则它只会被解析一次,而子级将处理页面导航。每次解析器被解析相当于浏览器中的页面刷新。
const routes: Routes = [
{
path: '',
component: TopComponent,
resolve: { loaded: PageLoadedResolver },
children: [
...
]
}
];
AppModule
的构造函数。@NgModule({...})
export class AppModule {
public constructor() {
console.log('page loaded');
}
}
一个注入到根组件中且至少被使用一次的服务。
@Injector({provideIn: 'root'})
export class MyService {
public constructor() {
console.log('page loaded');
}
}
还有一个 main.ts
文件,用于引导 Angular 应用程序。
platformBrowserDynamic().bootstrapModule(AppModule)
.then(() => console.log('page loaded'))
.catch(err => console.error(err));