- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Angular 5 ad 已经为组件实现了 CanDeactivateGuard,以便在有一些未保存的更改时弹出模式:
export interface CanComponentDeactivate {
canDeactivate: (nextStateUrl: string) => Observable<boolean> | boolean;
}
@Injectable()
export class CanDeactivateGuard implements CanDeactivate<CanComponentDeactivate> {
canDeactivate(
component: CanComponentDeactivate,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState?: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return component && component.canDeactivate
? component.canDeactivate(nextState.url)
: true;
}
}
我已将此守卫添加到第 2 页,如果我从第 1 页导航到第 2 页并进行一些更改并尝试导航离开,它会完美运行。但是,如果我停留在 page2 并刷新页面然后进行一些更改,然后尝试导航离开,将调用 guard 中的 canDeactivate 方法,但组件值为 null,因此它返回 true 而不显示确认模式。或者,如果我从 page2 导航到另一个尚未加载的页面。请注意,所有页面都是延迟加载的,并且每个页面都有其路由模块。
我已经按照与此处相同的方式将守卫添加到 page2 模块: http://plnkr.co/edit/z2OqgTXTiPpTgXcmNiDM?p=preview
我也试过把守卫加为主守卫,也没用。
请问是什么原因导致我刷新时组件为null,但从其他页面导航到第2页时,组件不在守卫中。
这里有任何修复吗?
谢谢
最佳答案
有几个选项。我只能让我的应用程序在使用 router-outlet 进行页面刷新时警告未决更改。参见 https://stackoverflow.com/a/51145053/2525272 .
根据您的环境,您可以使用类似这样的东西扩展 CanDeactivate 守卫 - https://medium.com/front-end-weekly/angular-how-keep-user-from-lost-his-data-by-accidentally-leaving-the-page-before-submit-4eeb74420f0d .或者这个 - https://code.i-harness.com/en/q/2242097 .此处也讨论了这一点以及我使用的内容 - Warn user of unsaved changes before leaving page .关键是将 HostListener 导入到 Angular 中以处理/拦截浏览器的 beforeunload 事件,以便它可以通过我们的路由守卫以确保您需要在页面脏时提示用户。简单地添加以下内容将始终提示用户是否有更改,因此具有误导性/混淆性。如果用户关闭标签页或浏览器,它也会始终提示用户,无论是否由于未保存的更改而需要提示。
// prevent losing changes with page refresh
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";
e.returnValue = confirmationMessage; // Gecko, Trident, Chrome 34+
return confirmationMessage; // Gecko, WebKit, Chrome <34
});
或者,像这样引入一个新的 CanActivate 守卫 - https://www.bennadel.com/blog/3368-prevent-routing-to-secondary-view-if-page-refresh-in-angular-5-0-0.htm .
另外,我真的很喜欢这个页面 - https://www.concretepage.com/angular-2/angular-candeactivate-guard-example以获得有关创建可重用路由保护服务的良好引用。
关于angular - 刷新页面时 CanDeactivateGuard 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51664459/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!