我有一個類似的問題,在這裏問的問題:How to manipulate a component on specific routes in Angular2
的主要問題是(這就是爲什麼我不建議使用@CanActivate
或onActivate
),您只能使用上的組件,這些Router
utils的哪些路由TO,而不是FROM。例如,如果您的app.component
中有一個頂欄或側邊欄,其模板內部有router-outlet
,則您無法以良好的方式訪問路線數據。
這就是爲什麼你只能擴展默認的router-outlet
並把你的邏輯放在那裏。
隨着@RouteConfig
看起來像這樣:
@RouteConfig([
{
path: '/login',
name: 'Login',
component: LoginComponent,
data: {
hideTopbar: true,
hideSidebar: true
}
},
,併爲您的app.component
看起來像這樣一個模板:
<div class="topbar" *ngIf="showTopbar">...</div>
<extended-router-outlet></extended-router-outlet>
你可以在app.component
類管理此:
export class AppComponent {
showTopbar:boolean;
showSidebar:boolean;
constructor(private _routingEventService:RoutingEventService) {
this._routingEventService.onRouteChanged().subscribe(routeData => {
this.showTopbar = !routeData.hideTopbar;
this.showSidebar = !routeData.hideSidebar;
});
}
}
使用注入的routingEventService l艾克接受的答案我上面鏈接:
@Injectable()
export class RoutingEventService {
private _eventEmitter: EventEmitter<any> = new EventEmitter();
routeIsChanging(obj:any) {
this._eventEmitter.emit(obj);
}
onRouteChanged() {
return this._eventEmitter;
}
}
然後終於,建立你的邏輯在新router-outlet
指令是這樣的:
@Directive({
selector: 'extended-router-outlet'
})
export class ExtendedRouterOutlet extends RouterOutlet {
private parentRouter:Router;
constructor(_elementRef: ElementRef,
_loader: DynamicComponentLoader,
_parentRouter: Router,
@Attribute('name') nameAttr: string,
private _routingEventService:RoutingEventService) {
super(_elementRef, _loader, _parentRouter, nameAttr);
this.parentRouter = _parentRouter;
}
activate(nextInstruction: ComponentInstruction): Promise<any> {
this._routingEventService.routeIsChanging({
name: nextInstruction.routeName,
hideTopbar: nextInstruction.routeData.data['hideTopbar'],
hideSidebar: nextInstruction.routeData.data['hideSidebar']
});
return super.activate(nextInstruction);
}
}
通過這種方法,你甚至可以處理其他航線具體的邏輯,例如要檢查身份驗證或角色,我在我的回答以下問題相同的方法在這裏解釋:
Fill form after http response in angular2
希望它有幫助。
我花了一段時間才明白,因爲我相對新的角2,但之後,它對我來說很好。 謝謝@lexith您的快速和良好的答案。 你幫了我很多! – marvstar
不客氣。 Fyi:你可能應該將此視爲一種解決方法。無論如何,路由器越來越受到NG團隊的熱愛,最終會讓事情變得更加容易。實際上我的一位同事告訴我,他通過訂閱路由器找到了這種情況的單線解決方案,但我沒有時間去查看它。該信息的 – lexith
thx。當Angular2是最終的時候,我們將看到我們應該如何處理這個問題。但如果你能讓我知道是否有更好或者更好的方法來做到這一點,那將是非常有益的。 – marvstar