我想在用户点击<a href="...">
链接之前添加提醒对话框。
<a>
链接有两种类型
答案 0 :(得分:4)
对于指向Angular应用程序的其他视图的链接,您可以实现CanDeactivate route guard。您可以在“主页”页面的 this stackblitz 中找到示例。
在应用程序外部导航的链接应该触发绑定到window:beforeunload
的事件处理程序(如下面的HomeViewComponent所示)。但是,它的行为在Firefox(显示确认框)和Chrome(未显示确认框)中似乎有所不同。据我所知,该事件无法使用stackblitz进行测试。
在app.module中:
...
import { AppRoutingModule } from './app.routing.module';
import { DeactivateGuard } from './views/home/deactivate-guard';
@NgModule({
imports: [
AppRoutingModule,
...
],
providers: [
DeactivateGuard
],
...
})
在app.routing.module中:
...
import { RouterModule } from '@angular/router';
import { DeactivateGuard } from './views/home/deactivate-guard';
@NgModule({
imports: [
RouterModule.forRoot([
...
{
path: 'home',
component: HomeViewComponent,
canDeactivate: [DeactivateGuard]
},
...
])
],
exports: [
RouterModule,
],
...
})
在家中/停用警卫:
import { CanDeactivate } from '@angular/router';
import { HomeViewComponent } from './home.component';
export class DeactivateGuard implements CanDeactivate<HomeViewComponent> {
canDeactivate(component: HomeViewComponent) {
return component.canDeactivate();
}
}
在home.component中:
import { Component, HostListener } from '@angular/core';
...
@Component({
...
})
export class HomeViewComponent {
@HostListener("window:beforeunload", ["$event"]) unloadHandler(event: Event) {
event.returnValue = false;
}
canDeactivate() {
return confirm("Do you want to leave?");
}
...
}
答案 1 :(得分:2)
因此Angular提供了canActivate,以确保您是否要根据特定条件激活路由。你可以
const routes: Routes = [
{path: '/some-path', canActivate:[AuthGuard]}
];
您的canActivate服务
import { Injectable } from '@angular/core';
import { CanActivate, CanActivateChild } from '@angular/router';
@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
canActivate() {
//ask if he really wants to route.
console.log('i am checking to see if you are logged ')
return true;
}
canActivateChild() {
console.log('checking child route access');
return true;
}
}
在canActivate中,您可以显示一个通用模型,询问他是否想要路由到URL,并根据这个模型,您可以控制哪个链接可以拥有它,哪个不可以。 您甚至可以为所有路由编写逻辑,无论它来自锚标记还是其他任何东西。
答案 2 :(得分:0)
试试这个
在html中
yourfunc(){
alert('navigate')
window.location.href='http://www.somewhere.com';
// your code to navigate
}
在你的
中f
答案 3 :(得分:0)
您可以实施路线保护,检查您的情况,然后根据您的选择决定是否重定向到点击的网址。
如果你跟随角度cli,那么你可以通过运行:
简单地安装路线保护
ng g guard my-new-guard
在app.module.ts中导入保护文件并将其添加到providers数组中。 在路由文件中,将路由防护添加到要检查条件的路径。喜欢:
const appRoutes: Routes = [
{path: '/your-path', canActivate: [route-guard]}
];
在你的路径保护文件中,你可以像这样实现你的逻辑:
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class AuthGuardGuard implements CanActivate {
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if(!state.url.startsWith('/')){
// I have check here for starting single slash for all your angular local routes. You can also check for http or https whichever you want according to your need
// here you can trigger your modal pop-up on its 'OK' button return true to redirect to the url
return true; // or return false on 'Cancel' button of modal pop-up for cancelling route if condition doesn't fullfill
}
}
}
答案 4 :(得分:0)
在.ts文件中
ngAfterViewInit() {
var aElements = this._elementRef.nativeElement.querySelectorAll('a');
var aElementsLen = aElements.length;
console.log('aElements==========>', aElements);
for(let i=0; i< aElementsLen; i++){
console.log('aElements[i]==========>', aElements[i]);
aElements[i].addEventListener('click', function(e){
e.preventDefault();
//return true; // If Redirect inside of Angular app
return false; // Redirect outside of Angular app and show popup
});
}
}
答案 5 :(得分:0)
我通过为<a>
创建组件,确认对话框组件和对话框服务来实现它
我正在使用Angular Material
import { Component, Inject, Output, EventEmitter } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
@Component({
selector: 'confirm-dialog',
templateUrl: './confirm-dialog.component.html',
})
export class ConfirmDialogComponent {
constructor(
public translate:TranslateService,
public dialogRef: MatDialogRef<ConfirmDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: any
) {
}
onClick(result): void {
this.dialogRef.close(result);
}
}
html文件
<h1 mat-dialog-title>{{data.title}}</h1>
<div mat-dialog-content>
<h4 class="card-title">{{ data.message }}</h4>
</div>
<div mat-dialog-actions class="pull-right">
<a *ngIf="data.confirm_link" class="btn btn-primary" mat-button tabindex="-1" href="{{ data.confirm_link }}" target="_blank" (click)="onClick(true)">{{ data.confirm_button }}</a>
<button *ngIf="!data.confirm_link" class="btn btn-primary" mat-button tabindex="-1" (click)="onClick(true)"> {{ data.confirm_button }} </button>
<button class="btn btn-info" mat-button tabindex="-1" (click)="onClick(false)">Cancel</button>
</div>
创建组件后,我希望可以从任何地方轻松调用,因此为其创建服务
import { Injectable, OnDestroy} from "@angular/core";
import { Subject } from 'rxjs/Subject';
import { MatDialog } from '@angular/material';
import { ConfirmDialogComponent } from 'path/to/confirm-dialog/confirm-dialog.component';
import * as _ from 'lodash';
@Injectable()
export class ConfirmService implements OnDestroy{
private subject = new Subject<any>();
private message = 1;
info: any;
constructor(private dialog: MatDialog){
}
show(data: any){
let dialogRef = this.dialog.open(ConfirmDialogComponent, {
width: '500px',
data: data,
});
dialogRef.afterClosed().subscribe(result => {
this.subject.next(result);
});
return this.subject;
}
ngOnDestroy() {
}
}
<a>
元素为了更容易在 .html 文件中使用,我为它创建了一个组件
import { Component, OnInit, Input } from '@angular/core';
import { ConfirmService } from 'path/to/service/confirm.service';
@Component({
selector: 'a-external',
templateUrl: './a-external.component.html',
})
export class AExternalComponent implements OnInit {
@Input('href') href: string;
@Input('class') classes: string;
@Input('content') content: string;
constructor(
private confirmService:ConfirmService,
) { }
ngOnInit() {
}
onAClick() {
var dialog = this.confirmService.show({
'title': 'Warning',
'message': 'This will open a new tab',
'confirm_button': 'open',
'confirm_link': this.href, // if pass in the uri, will open in new tab
});
var subscription = dialog.subscribe((result) => {
// if the result is true, means Confirm button is clicked
// if the result is false, means Cancel button is clicked
subscription.unsubscribe();
});
}
}
confirm_link
仅适用于打开新标签页。没有该值,它只会触发对话框订阅结果。
而且html文件非常简单
<a href="javascript:" class="{{ classes }}" (click)="onAClick()">{{ content }}</a>
<a-external [href]="http://www.foobar.com" [class]="'btn btn-info'" [content]="'The content inside a element'"></a-external>