angular如何实现跳转页面前提示跳转

angular如何实现跳转页面前提示跳转

场景:

有时在编辑过程中,不小心点到后退按钮等,会让之前的编辑全都作废了,因此想通过跳转页面前弹出框提示保存来阻止页面跳转,并提示用户及时保存

解决方案:

可以通过route来实现
在要判断的页面的路由处,利用Route.canDeactivate来获取是否使某个组件无效

const routes: Routes = [

{
    path: 'profile',
    component: ProfileComponent,
    
canDeactivate: [ConfirmOnExitGuard],

    data: {
        auth: [Authority.SYS_ADMIN],
        title: 'profile.profile',
        breadcrumb: {
            label: 'profile.profile',
            icon: 'account_circle'
        }
    },
    resolve: {
        user: UserProfileResolver
    }
}
];

canDeactivate: [ConfirmOnExitGuard],
在这里插入图片描述

新建一个文件用来实现ConfirmOnExitGuard类

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot } from '@angular/router';
import { FormGroup } from '@angular/forms’;
import { DialogService } from '@core/services/dialog.service';
import { isDefined } from '../utils';


export interface HasConfirmForm {
    confirmForm(): {dirty:boolean};
}

export interface HasDirtyFlag {
    isDirty: boolean;
}

@Injectable({
providedIn: 'root'
})
export class ConfirmOnExitGuard implements CanDeactivate<HasConfirmForm & HasDirtyFlag> {

    constructor(private store: Store<AppState>,
    private dialogService: DialogService) { }

    canDeactivate(component: HasConfirmForm & HasDirtyFlag,route: ActivatedRouteSnapshot,state: RouterStateSnapshot) {
        let isDirty = false;
        if (component.confirmForm) {
            const confirmForm = component.confirmForm();
            if (confirmForm) {
                isDirty = confirmForm.dirty;
            }
        } else if (isDefined(component.isDirty)) {
            isDirty = component.isDirty;
        }
        if (isDirty) {
            //如果有脏数据,弹出提示框,并返回用户的选择,确认还是取消离开
            return this.dialogService.confirm(
                ‘未保存的更改’,
                ‘您有未保存的更改。确认要离开此页面吗?’
            );
        }
        //否则返回true,离开页面
        return true;
    }
}

最后,在要判断的页面中,实现confirmForm.dirty

confirmForm() :FormGroup | {dirty:boolean}{
    let obj={
        dirty: this.isEdit // 将该页面的编辑状态赋值给dirty
    }
    return obj;
}

最后看看效果
在这里插入图片描述

### Angular 路由跳转页面视图不刷新解决方案 当遇到Angular路由跳转页面视图未刷新的情况,通常是因为框架检测不到URL变化或认为新旧路径相同而阻止了不必要的重新渲染。为了确保每次路由改变都能触发组件的重新初始化和数据获取操作,有几种方法可供尝试: #### 方法一:使用`onSameUrlNavigation` 可以通过修改路由器配置来允许相同的 URL 导航请求。这使得即使目标地址与当地址相匹配也会执行完整的导航流程。 ```typescript @NgModule({ imports: [ RouterModule.forRoot(routes, { onSameUrlNavigation: 'reload' // 设置此选项以支持同一路由下的重载行为 }) ], }) export class AppRoutingModule {} ``` 这种方法简单有效,在大多数情况下能够满足需求[^4]。 #### 方法二:手动控制组件销毁重建逻辑 如果仅靠上述设置仍无法解决问题,则可以在服务端或者客户端加入额外判断机制,比如利用 `ActivatedRouteSnapshot` 来比较后两次访问的具体差异点,并据此决定是否需要主动调用某些清理函数或是模拟一次新的实例化过程。 #### 方法三:强制刷新特定部分的内容 对于不需要整个页面都重新加载的情形,可以选择性地只更新受影响区域的数据源并通知对应的子组件去拉取最新状态。例如通过订阅路由参数的变化事件来进行局部刷新处理。 ```typescript constructor(private route: ActivatedRoute) {} ngOnInit() { this.route.params.subscribe(params => { // 当路由参数发生变化时,这里会收到通知 console.log('Params changed:', params); // 执行必要的业务逻辑,如发起HTTP请求获取最新的数据显示 }); } ``` 此外还可以考虑采用其他策略,像调整模板文件中的资源链接指向动态版本号等方式防止浏览器缓存干扰正常显示效果[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值