HTML:
<router-outlet></router-outlet>
零件:
@Component({
selector: 'xx',
templateUrl: './xx.html',
styleUrls: ['./xx.css'],
providers: [ RouterOutlet]
})
export class AppComponent {
constructor(private routeroutlet: RouterOutlet){ }
getref() {
console.log(this.routeroutlet);
console.log('refresh', this.routeroutlet.component);
}
}
我收到了这个错误
core.es5.js:1224 ERROR Error: Outlet is not activated
at RouterOutlet.get [as component] (router.es5.js:5449)
at AppComponent.onRefreshscrum (app.component.ts:343)
at Object.eval [as handleEvent] (AppComponent.ngfactory.js:111)
at Object.handleEvent (core.es5.js:12251)
at Object.handleEvent (core.es5.js:12975)
at dispatchEvent (core.es5.js:8863)
at eval (core.es5.js:11025)
at SafeSubscriber.schedulerFn [as _next] (core.es5.js:3851)
at SafeSubscriber.__tryOrUnsub (Subscriber.js:223)
at SafeSubscriber.next (Subscriber.js:172)
控制台结果:(this.routeroutlet)
RouterOutlet {
parentContexts: ChildrenOutletContexts,
location: null,
resolver: CodegenComponentFactoryResolver,
changeDetector: ViewRef_,
activated: null, …}activateEvents: EventEmitter {_isScalar: false, observers: Array(0),
closed: false,
isStopped: false,
hasError: false,
…}
closed: false
hasError: false
isStopped: false
observers: []thrown
Error: null
__isAsync: false
_isScalar: false
__proto__: Subject
activated: null
activatedRoute: (...)activatedRouteData: (...)changeDetector: ViewRef_ {_view: {…}, _viewContainerRef: null, _appRef: null}
component: [Exception: Error: Outlet is not activated
at RouterOutlet.get [as component] (webpack:///./~/@angular/router/@angular/router.es5.js?:5449:23)
at RouterOutlet.remoteFunction (<anonymous>:2:26)]deactivateEvents: EventEmitter {_isScalar: false, observers: Array(0),
closed: false,
isStopped: false,
hasError: false, …}
isActivated: (...)location: nulllocationFactoryResolver: (...)l
ocationInjector: (...)name: "primary"
parentContexts: ChildrenOutletContexts {contexts: Map(1)}resolver: CodegenComponentFactoryResolver {_parent: null, _ngModule: NgModuleRef_, _factories: Map(52)}_activatedRoute: null__proto__: ObjectactivateWith: ƒ (activatedRoute, resolver)activatedRoute: (...)activatedRouteData: (...)attach: ƒ (ref, activatedRoute)component: (...)deactivate: ƒ ()detach: ƒ ()isActivated: (...)locationFactoryResolver: (...)locationInjector: (...)ngOnDestroy: ƒ ()ngOnInit: ƒ ()arguments: (...)caller: (...)length: 0name: ""prototype: {constructor: ƒ}__proto__: ƒ ()[[FunctionLocation]]: router.es5.js:5400[[Scopes]]: Scopes[3]constructor: ƒ RouterOutlet(parentContexts, location, resolver, name, changeDetector)get activatedRoute: ƒ ()get activatedRouteData: ƒ ()get component: ƒ ()get isActivated: ƒ ()get locationFactoryResolver: ƒ ()get locationInjector: ƒ ()__proto__: Object
上面的控制台结果是控制台routeroutlet obj。
我想访问在router-outlet中呈现的组件的实例。我如何访问组件的实例?
不要尝试将RouterOutlet用作提供程序。而是将(activate)属性添加到router-outlet标签,如下所示:
<router-outlet (activate)="onRouterOutletActivate($event)"></router-outlet>
然后在包含router-outlet元素(您的AppComponent类)的组件中,您应该实现onRouterActivate方法:
public onRouterOutletActivate(event : any) {
console.log(event);
}
这将为您提供event参数中的路由组件实例,在此示例中写入Web控制台。
如果你想要DOM元素,你需要获得router-outlet
的DOM元素,然后在activate()事件之后获得下一个兄弟元素。
const sib = this.element.nativeElement.nextSibling;
有几种方法可以获得router-outlet
元素,例如ViewChild
。
另一种方法是使用指令,应用于router-outlet
。我用这种方法来制作a directive that adds classes to the component DOM element。