Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >刷新页面时CanDeactivateGuard不起作用

刷新页面时CanDeactivateGuard不起作用
EN

Stack Overflow用户
提问于 2018-08-03 02:20:28
回答 1查看 2.9K关注 0票数 1

我使用Angular 5实现了一个组件的CanDeactivateGuard,如果有一些未保存的更改,它会弹出一个模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
  }
}

我已经将这个保护添加到page2中,如果我从页面1导航到page2,并进行一些更改,然后尝试导航离开,它就可以完美地工作。但是,如果我停留在page2中并刷新页面,然后进行一些更改,并尝试离开,则将调用防护中的canDeactivate方法,但组件值为空,因此它返回true,而不显示确认模式。或者如果我从page2导航到另一个尚未加载的页面。请注意,所有页面都是延迟加载的,并且每个页面都有自己的路由模块。

我已经以同样的方式向page2模块添加了保护:http://plnkr.co/edit/z2OqgTXTiPpTgXcmNiDM?p=preview

我也试着把守卫添加到主守卫,但也不起作用。

有没有什么原因,当我刷新组件为空时,当我从其他页面导航到第2页时,该组件不在保护范围内。

这里有解决它的方法吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-02-12 17:05:15

有几个选择。我只能让我的应用程序在使用router-outlet进行页面刷新时警告挂起的更改。参见https://stackoverflow.com/a/51145053/2525272

根据您的环境,您可以使用类似于- https://medium.com/front-end-weekly/angular-how-keep-user-from-lost-his-data-by-accidentally-leaving-the-page-before-submit-4eeb74420f0d的内容来扩展CanDeactivate防护。或者这个- https://code.i-harness.com/en/q/2242097。这里也讨论了这一点,我使用的是- Warn user of unsaved changes before leaving page。关键是将HostListener导入Angular来处理/拦截浏览器的beforeunload事件,这样它就可以通过我们的路由保护,以确保您需要在页面脏时提示用户。简单地添加以下内容将始终提示用户,无论是否有更改,因此这是误导/令人困惑的。如果用户关闭其选项卡或浏览器,它还将始终提示用户,而不管是否由于未保存的更改而需要提示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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,这是一个关于创建可重用的路由守卫服务的很好的参考。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51664459

复制
相关文章
MySQL括号字符串计数
现在想得出每种评论字数的个数,每个字符包括标点、空格、表情符号都算一个字,但每对中括号连同其中的内容只算一个字。对于上面的数据行,结果为:
用户1148526
2022/11/14
1.3K0
MySQL括号字符串计数
MySQL实现批量Insert和分页查询
DROP PROCEDURE IF EXISTS test_insert;--如果存在此存储过程则删掉
浩Coding
2019/07/03
4.1K0
MySQL实现批量Insert和分页查询
MySQL中INSERT INTO SELECT的应用
这种方法常用在目标表已经存在数据库中.需要从源表把数据插入到目标表的情况.如果目标表和源表的列相同,就不必列出数据列了.(未完待续,另参考资料中重复项太多,暂且作为记录,后期再做增删整理)
WindCoder
2018/09/20
3.3K0
MySQL 查询结果中处理字符串
但是如果查询过程中有一个字符串为 null 则整个结果都将是 null ,这时可以将 null 转换为 “
zucchiniy
2019/10/30
4.3K0
Mysql中的INSERT ... ON DUPLICATE KEY UPDATE
在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作;
美团骑手
2021/12/24
1.8K0
shell中的括号(小括号,中括号,大括号)
    ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
雪影
2018/08/02
3.9K0
MySQL中insert阻塞问题的分析
今天收到一个业务报警,提示某个数据库实例的连接数暴涨,然后瞬间又恢复了,这种情况持续反复了几次,和开发同学沟通时,他们也希望能够得到更多的信息,比如是哪个数据库的连接数异常暴涨,我也想知道啊,但是苦于没有合适的工具和方法能够实现更细粒度的监控/统计,于是我着手开始分析这个问题。
jeanron100
2020/08/25
1.8K0
MySQL中insert阻塞问题的分析
前端传值不能带中括号???
将前端传值通过enencodeURI()进行转义,后台部分需要通过 URLDecoder.decode()进行解析
taixingyiji
2022/07/25
9940
前端传值不能带中括号???
Mysql中的关联查询(内连接,外连接,自连接)
在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询
全栈程序员站长
2022/09/01
3.9K0
Mysql中的关联查询(内连接,外连接,自连接)
MySQL 中的 INSERT 是怎么加锁的?
来源:https://www.aneasystone.com/archives/2018/06/insert-locks-via-mysql-source-code.html
Java技术栈
2021/11/12
11.3K0
在字符串中查找id值MySQL
SELECT * FROM `hz_article_type` WHERE FIND_IN_SET( 5, items_id ) LIMIT 0 , 30
全栈程序员站长
2022/07/07
5.4K0
在字符串中查找id值MySQL
MySQL 多表查询、连接查询(内连接、外连接)
查询的结果是一个二维表,它是students表和classes表的“乘积”,即students表的每一行与classes表的每一行都两两拼在一起返回
Michael阿明
2020/07/13
3.8K0
MySQL 多表查询、连接查询(内连接、外连接)
Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践
在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作;
加多
2018/09/06
2.4K0
Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践
在 JavaScript 中优雅的提取循环内的数据 [每日前端夜话0x2D]
从 A 行开始的循环用来记录文件路径。它是 for-of 循环和递归的组合(递归调用在 B 行)。
疯狂的技术宅
2019/03/27
3.7K0
在 JavaScript 中优雅的提取循环内的数据 [每日前端夜话0x2D]
python从字符串中提取数字
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124581.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/21
3.3K0
SQL 从字符串中提取数字
mix 表有一个 varchar 类型的字段 v,该字段的允许长度只有 15 位,但它存储的数据比较混杂。
白日梦想家
2020/12/14
2.5K0
js提取正则中的字符串
代码如下: var results = data.match(/(start=').*?(')/); if (results != null) { console.log(data[0]);
磊哥
2018/05/08
5.5K0
Jmeter 正则表达式提取括号中的文本内容
     jmeter里接口请求结束后,如果后续接口请求想要获取本次返回结果的内容,就需要正则表达式提取器来获取参数,当然也可以用json path extractor来提取(这个简单一些)。不过Jmeter里很多地方的约束条件和断言都是需要正则表达式来匹配的,所以大家还是要学习一下正则表达式的语法,以便更好更效率的完成测试内容。下面简单介绍一下常用的语法,这次先写一半,下次再补另一半。正则表达式的内容还是很多的,我也只是学了其中的一些皮毛,通用的东西,后期再慢慢深入吧,而且要学以致用,学的东西一定要亲自实际体验一下才会记得牢,好了,言归正转。
全栈测试开发日记
2023/02/02
1.6K0
Jmeter 正则表达式提取括号中的文本内容
MySQL数据插入INSERT INTO与条件查询WHERE的基本用法(二)
上节课给大家介绍了数据库的基本概念以及如何创建数据库,具体可回顾MySQL创建数据库(一)。从本节课开始,我们将对MySQL中的基本知识点进行分别介绍。本节课先向大家介绍MySQL数据插入insert into与where条件查询的基本用法。
用户7569543
2021/10/20
4.5K0
点击加载更多

相似问题

从括号内提取(子)字符串

22

MySQL中的按组查询忽略括号内的值

10

从SQL insert查询字符串中提取引用的值

21

从python中括号内提取数据

13

如何从‘`onclick`’属性值括号内提取数据?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文