如何全局访问根Angular 2注入器的实例(例如,从浏览器控制台访问)。
在Angular 1中,它是angular.element(document).injector()
。
在测试和探索过程中,使用浏览器控制台获取注入器然后访问不同组件,指令,服务等的实例会非常有用。
答案 0 :(得分:13)
您必须在引导应用程序后将其设置为服务:
export var applicationInjector: Injector;
bootstrap([AppComponent]).then((componentRef: ComponentRef) => {
applicationInjector = componentRef.injector;
});
然后您可以将其导入应用程序的其他部分:
import {applicationInjector} from './bootstrap';
有关详细信息,请参阅此问题:
修改强>
您可以将ApplicationRef
注入组件并通过它访问根注入器:
@Component({
(...)
})
export class SomeComponent {
constructor(private app:ApplicationRef) {
var rootInjector = app.injector;
}
}
您需要利用依赖注入来获取它。
答案 1 :(得分:11)
在Angular v.4.x.x
中,根注入器位于PlatformRef。您可以像这样访问它:
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
// create a platform
let platform = platformBrowserDynamic();
// save reference to the global object
window['rootInjector'] = platform.injector;
// boostrap application
platform.bootstrapModule(AppModule);
或者在这样的任何组件内部:
export class AppComponent {
constructor(platform: PlatformRef) {
console.log(platform.injector);
但root
注射器非常无用。它主要包含编译器和平台特定的数据和帮助程序:
[
"InjectionToken Platform ID",
"PlatformRef_",
"PlatformRef",
"Reflector",
"ReflectorReader",
"TestabilityRegistry",
"Console",
"InjectionToken compilerOptions",
"CompilerFactory",
"InjectionToken Platform Initializer",
"PlatformLocation",
"InjectionToken DocumentToken",
"InjectionToken Platform: browserDynamic",
"InjectionToken Platform: coreDynamic",
"InjectionToken Platform: core"
]
你可能正在寻找AppModule
注射器,你可以这样:
platform.bootstrapModule(AppModule).then((module) => {
window['rootInjector'] = module.injector;
});
您可以从中提取ApplicationRef或根ComponentRef:
platform.bootstrapModule(AppModule).then((module) => {
let applicationRef = module.injector.get(ApplicationRef);
let rootComponentRef = applicationRef.components[0];
});
此外,如果Angular在开发模式下运行,您可以获得AppModule或延迟加载的NgModule注入器,如下所示:
ng.probe($0).injector.view.root.ngModule
答案 2 :(得分:1)
这是Angular 9的另一种体现。
在不在生产节点中的Angular应用程序页面上打开JavaScript控制台。
在页面上找到<app-root>
:
root = document.querySelector("app-root");
获取进样器。 ng()
助手是一个全局变量,如果应用程序处于开发模式,则可以使用它:
injector = ng.getInjector("app-root");
Injector允许您通过其类名称获得服务。不幸的是,我不知道是否可以通过window
命名空间使用Angular服务类或如何使用它。
因此,我们的下一个尝试是从页面上已经可见的元素的组件中获取服务。
appComponent = ng.getComponent(root)
通过这种方式,您可以访问任何AppComponent
变量,例如您的应用可能具有“ UserService”。
appComponent.userService
UserService {http: HttpService, userSubject: BehaviorSubject}
现在您可以从控制台调用该服务:
appComponent.userService.userSubject.value.userEmail
mikko@capitalgram.com
您还可以访问不是应用程序根目录的组件,并访问绑定到它们的服务。首先,我们需要导航到该组件出现的页面。这将触发用户界面中的实际过渡。
await appComponent.router.navigate(["/another-page"])
现在,您可以通过其标签名称来获取任何可见组件:
elem = document.querySelector("app-my-component")
component = ng.getComponent(elem)
您可以看到其服务:
MyComponent(envService, http, sanitizer);
您可以使用所有用户令牌,会话等将它们戳出:
component.envService.getConfigValue()