Có cách nào chúng ta có thể chuyển hướng đến một thành phần khác từ @CanActivate trong Angular2 không?Chuyển hướng đến một thành phần khác bên trong @CanActivate trong Angular2
Trả lời
Có, bạn có thể! Làm như vậy sẽ ngăn không cho thành phần của bạn khởi tạo không có gì.
Đầu tiên, tạo một tập tin mới src/app-injector.ts
let appInjectorRef;
export const appInjector:any = (injector = false) => {
if (!injector) {
return appInjectorRef;
}
appInjectorRef = injector;
return appInjectorRef;
};
Sau đó, có được tham khảo từ bootstrap
// ...
import {appInjector} from './app-injector';
// ...
bootstrap(App, [
ROUTER_PROVIDERS
]).then((appRef) => appInjector(appRef.injector));
Cuối cùng trong chức năng của bạn
// ...
import {appInjector} from './app-injector';
// ...
@CanActivate((next, prev) => {
let injector = appInjector();
let router = injector.get(Router);
if (42 != 4 + 2) {
router.navigate(['You', 'Shall', 'Not', 'Pass']);
return false;
}
return true;
})
Et voilà!
Nó được thảo luận ở đây https://github.com/angular/angular/issues/4112
Bạn có thể tìm thấy một ví dụ hoàn chỉnh ở đây http://plnkr.co/edit/siMNH53PCuvUBRLk6suc?p=preview bởi @brandonroberts
Chỉnh sửa câu trả lời của bạn (nếu được chấp thuận): 'const xuất khẩu appInject: any' khác lỗi sẽ được ném vào nguyên cảo biên dịch. – lexith
Tính đến hôm nay, với mới nhất @ góc/router 3.0.0-rc.1, đây là một vài tài liệu tham khảo về cách để làm điều đó thông qua CanActivate
lính gác trên các tuyến đường:
- angular 2 reference
- Hai câu trả lời cho SO câu hỏi này, bởi Nilz11 và bởi Jason
Các ý chính của logic hình như:
// ...
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this.authService.isLoggedIn) {
// all ok, proceed navigation to routed component
return true;
}
else {
// start a new navigation to redirect to login page
this.router.navigate(['/login']);
// abort current navigation
return false;
}
}
Đây sẽ là câu trả lời ưu tiên mới với bộ định tuyến mới. –
rất thích xem cách chuyển hướng đến đường dẫn dự định được thực hiện sau khi nhật ký người dùng sử dụng bảo vệ xác thực này. – Davvit
@Davvit Tôi không chắc chắn nên làm gì với chỉnh sửa được đề xuất: bằng cách thêm thông số vào cuộc gọi, chúng tôi không cung cấp nhiều thông tin hơn. Sẽ không hữu ích hơn cho tôi và những người khác nếu bạn thêm một câu trả lời mới, nơi bạn đặt tất cả các bổ sung và thay đổi để đáp ứng truy vấn của bạn? Bạn nghĩ sao? – superjos
góc 2.0 giải pháp cuối cùng:
bảo vệ của bạn có thể dễ dàng chỉ là một tiêm mà, như vậy, có thể bao gồm thuốc chích riêng. Vì vậy, chúng tôi có thể chỉ cần tiêm bộ định tuyến, để chuyển hướng. Đừng quên thêm dịch vụ làm nhà cung cấp trong mô-đun ứng dụng của bạn.
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router, private authService: AuthService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
if (!authService.isAuthenticated()) {
this.router.navigate(['/login']);
return false;
}
return true;
}
}
export const ROUTES: Routes = [
{path: 'login', component: LoginComponent},
{path: 'protected', loadChildren: 'DashboardComponent', canActivate: [AuthGuard]}
];
Điều này có thể giúp ai đó đang cố gắng chờ đợi điều gì đó trước khi tiếp tục.
waitForBonusToLoad(): Observable<[boolean, string]> {
const userClassBonusLoaded$ = this.store.select(fromRoot.getUserClasssBonusLoaded);
const userClassSelected$ = this.store.select(fromRoot.getClassAttendancesSelectedId);
return userClassBonusLoaded$.withLatestFrom(userClassSelected$)
.do(([val, val2]) => {
if (val === null && val2 !== null) {
this.store.dispatch(new userClassBonus.LoadAction(val2));
}
})
.filter(([val, val2]) => {
if(val === null && val2 === null) return true;
else return val;
})
.map(val => {
return val;
})
.take(1);
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.waitForBonusToLoad().map(([val, val2]) =>
{
if(val === null && val2 === null){
this.router.navigate(['/portal/user-bio']);
return false;
}
else {
return true;
}
}
)
}
Giải pháp được đề xuất của bạn có chứa các tác dụng phụ trong Observable.map() Thay vào đó, bạn nên di chuyển điều hướng ra khỏi bản đồ() và vào làm(). Bản đồ của bạn chỉ cần giải quyết TRUE/FALSE. Quan sát $ .map ((x) => x === 1) .do (result => {if (result) navigation();}); –
- 1. Angular2 truyền dữ liệu từ CanActivate guard đến Resolve resolver?
- 2. Angular2 canLoad vs canActivate
- 3. Làm cách nào để chuyển hướng đến URL bên ngoài từ tuyến đường angular2 mà không sử dụng thành phần?
- 4. Vue.js chuyển hướng đến một trang khác
- 5. tuyến chuyển hướng đến một số khác
- 6. Góc 2, thành phần bên trong thành phần chính
- 7. Angular2 Html bên trong một Component
- 8. Angular2 chuyển tương tác thành phần với mẹ
- 9. .htaccess chuyển hướng đến URL bên ngoài trong khi ẩn chuyển hướng
- 10. Angular2: Hiển thị các thành phần "thanh công cụ" khác nhau tùy theo điều hướng chính
- 11. Chuyển hướng đến URL chứa 'phần biến' trong Flask (Python)
- 12. Ràng buộc vào một thuộc tính thành phần trong angular2
- 13. Truy cập phần tử trong thành phần Angular2 JavaScript ES5
- 14. Làm thế nào để chuyển một biểu thức thành một thành phần làm đầu vào trong Angular2?
- 15. Cách khai báo các thành phần lồng nhau trong Angular2
- 16. Chuyển hướng đến hành động trong bộ điều khiển khác
- 17. MVC - Chuyển hướng bên trong Constructor
- 18. mod_rewrite chuyển hướng một tên miền đến một URL khác
- 19. Angular2 thành phần đệ quy
- 20. ASP.NET MVC 3 - chuyển hướng đến một hành động khác
- 21. Apache2 chuyển hướng đến một tên miền khác với ssl
- 22. Angular2: các thuộc tính ng-content chuyển đến thành phần con
- 23. Angular2: chuyển boolean thành @Input
- 24. Tải lại thành phần con khi các biến trên thành phần phụ huynh thay đổi. Angular2
- 25. cách làm các thành phần đáp ứng trong Angular2
- 26. tự động chuyển hướng đến một trang html khác
- 27. angular2: bao gồm các tập lệnh js của bên thứ ba trong thành phần
- 28. Tạo Trang WordPress chuyển hướng đến một URL khác
- 29. Chuyển hướng một trang sang một trang khác trong 5 giây sau đó chuyển hướng lại
- 30. Cách chuyển hướng đến một phần cụ thể của trang trong html
Vui lòng thay đổi câu trả lời chấp nhận câu trả lời @ superjos, thay vì câu trả lời lạc hậu từ Jk Jensen –