如果进行了任何更改,如何在离开Angular 4页面时提示用户?

保罗

在Angular4页面中有两个选项卡(PrimeNg Tabview),其中包含许多输入字段,例如文本框textareas下拉列表等。我还有一个侧边菜单栏,可导航到应用程序内的其他页面。我想要如果这些输入字段中的数据有任何更改,那么如果用户尝试更改选项卡或使用侧面导航到其他页面,那么将出现一个弹出消息(模式或确认框)菜单栏。

我已经尝试过该ngOnDestroy()方法。尽管仅在关闭页面时(通过导航到其他页面或移至下一个选项卡页面)才会触发此方法,但是由于该方法处于销毁生命周期挂钩上,因此它不允许您从方法内部显示模式/确认框。

如果页面/表单的任何输入字段中都有更改,请帮助我确定实际事件,通过该事件我可以在确认框中提示用户。

@surjit建议:

my-guard.service.ts

export interface CanComponentDeactivate {
    CanDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
}

@Injectable()
export class CreateRequestGuardService implements CanDeactivate<CanComponentDeactivate> {
    canDeactivate(component: CanComponentDeactivate) {
        let vDeactivate = component.CanDeactivate ? component.CanDeactivate() : true;
        return vDeactivate;
    }   
}

my-component.ts内部

import { CreateRequestGuardService } from './my-guard.service';

canDeactivate(): Observable<boolean> | boolean {
    console.log('I am moving away!');
    if (!this.isSaved) {
        const confirmation = window.confirm('Are you sure?');
        return Observable.of(confirmation);
    }
    else{
        return true;
    }
}

my-router.ts中

import { CreateRequestGuardService } from './my-guard.service';

const allRoutes: Routes = [
   { path: 'save', component: my-component, canDeactivate: [MyGuardService]},
   { path ....},
   ..
]
苏吉特

CanDeactivate在要保护的组件路径中使用防护

阅读CanDeactivate以获得更多信息

更新:这是我的伪代码。未经测试

my-guard.service.ts:

export interface CanComponentDeactivate {
    CanDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
}

@Injectable()
export class CreateRequestGuardService implements CanDeactivate<CanComponentDeactivate> {
    canDeactivate(component: CanComponentDeactivate, 
                  currentRoute: ActivatedRouteSnapshot, 
                  currentState: RouterStateSnapshot, 
                  nextState?: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
        return component.canDeactivate(); //the function will be called on the component, that's why we'll implement the function on the component.
    }   
}

my-router.ts:

import { CreateRequestGuardService } from './my-guard.service'; //the class name in my-guard.service.ts

const allRoutes: Routes = [
   { path: 'save', component: myComponent, canDeactivate: [CreateRequestGuardService]},
   { path ....},
   ..
]

我的component.ts

import { CreateRequestGuardService } from './my-guard.service';

export class myComponent implements CanComponentDeactivate { //implements the interface created on the guard service

    /*
        your component data
    */
    //implementation of canDeactivate
    canDeactivate(): Observable<boolean> | Promise<boolean> | boolean {
        if(form_is_edited && not_saved){
            return confirm("Discard Changes?");
        }
        else
            return true;
    }
}

注意:也不要忘记将防护服务(类)添加到文件中providers阵列app.module.ts

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

离开页面时提示用户

检查用户登录的页面是否在Angular 2中进行了更改

如何从Spring MVC输入angular4页面

Codeigniter 4-如何显示404页面?

如何检查用户是否在24小时滑轨之前进行了投票4

当用户在同一页面中登录时,如何使用另一个CSS设计更改登录名<li>

在关闭Angular材质对话框之前,检查用户是否对Reactive表单进行了更改

Javascript-当用户单击链接移至另一页面时,中止所有正在进行的http请求(图像/视频下载)

当点击网页中的语言更改链接时,LARAVEL 将用户重定向到他们正在查看的同一页面

当用户在Spring Boot应用程序中输入无效的URL时如何显示自定义404页面?

如果用户在页面名称后输入结尾的“ /”(或“ /”之后的任何内容),如何将用户重定向到错误404页面?

“属性”面板在以后更新页面底版时进行了更改

打开trapi / admin页面时如何修复404页面?

如何知道jtextarea中是否进行了任何更改?

如何检查rsync是否对bash进行了任何更改?

全屏显示时如何更改HTML5页面

进行了更正,需要执行switch语句并提示用户选择歌曲时输入

如何让用户在同一页面中选择不同的Facebook权限?

如何将未经授权的用户重定向到403页面

如何在烧瓶中渲染同一页面时显示引导模态

用户首次访问页面时如何删除工具提示?

当有人访问任何.php时返回404页面?

单击链接到同一页面时更改个人资料图片

RealmSwift错误:“ RLMException,原因:对集合进行枚举时对其进行了更改。”

在vuepress中更改404页面

仅保存如果进行了更改

Express.js-使用路由参数时如何处理404页面

当未明确设置路由时,如何使Prerender.io识别唯一页面?

Angular 2登陆页面