You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 5:如何在ES6/ES5环境(无TypeScript)中注入Router服务

TL;DR

我希望在ES6/ES5环境(不使用TypeScript)下,将Angular Router服务注入到组件中。


大家好,

我最近为JavaScript创建了一个Angular 5代理库,因为我不想使用TypeScript。该库可用于创建Component、Injectable服务和NgModule,且运行正常。

下面是一个可运行的示例代码:

// ng变量包含Angular 5库中的{ compiler, common, core, router, platformBrowserDynamic, platformBrowser }
class Service {
 constructor() {}
 toUpperCase(string) {
 return String(string).toUpperCase();
 }
}
// 类似@Injectable
Injectable({})(Service);
class HomeComponent {
 constructor(service) {
 this.message = service.toUpperCase('hello');
 }
}
// 类似@Component
Component({
 selector: 'home-component',
 providers: [Service],
 template: `
 <h1>{{ message }}</h1>
 `
})(HomeComponent);
class Module {
 constructor() {}
}
// 类似@NgModule
NgModule({
 imports: [ng.platformBrowser.BrowserModule],
 declarations: [HomeComponent],
 providers: [],
 bootstrap: [HomeComponent]
})(Module);
ng.platformBrowserDynamic.platformBrowserDynamic().bootstrapModule(Module);

上述代码可实现自定义Injectable服务的创建及其向组件的注入。

问题描述

当我尝试注入Router这类Angular内置服务时,会触发Angular注入器错误:

Error: Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?, ?).

对应的错误演示代码如下:

// ng变量包含Angular 5库中的{ compiler, common, core, router, platformBrowserDynamic, platformBrowser }
class Service {
 constructor() {}
 toUpperCase(string) {
 return String(string).toUpperCase();
 }
}
// 类似@Injectable
Injectable({})(Service);
class HomeComponent {
 constructor(service, router) {
 this.message = service.toUpperCase('hello');
 }
}
// 类似@Component
Component({
 selector: 'home-component',
 providers: [Service, ng.router.Router],
 template: `
 <h1>{{ message }}</h1>
 `
})(HomeComponent);
class Module {
 constructor() {}
}
// 类似@NgModule
NgModule({
 imports: [
 ng.platformBrowser.BrowserModule,
 ng.router.RouterModule
 ],
 declarations: [HomeComponent],
 providers: [],
 bootstrap: [HomeComponent]
})(Module);
ng.platformBrowserDynamic.platformBrowserDynamic().bootstrapModule(Module);

注入Angular内置服务的方式是否与自定义Injectable服务不同?我的NgModule装饰器代码如下:

function NgModule(metadata = {}) {
 return function decorator(target) {
 target.annotations = [new core.NgModule(metadata)];
 target.parameters = [];
 if (!!metadata.providers && Array.isArray(metadata.providers)) {
 metadata.providers.forEach(provider => {
 if (!provider.useValue && !provider.useClass) {
 // 示例中的Service类
 target.parameters.push([new core.Inject(provider)]);
 } else {
 // 类似{ provide: LOCALE_ID, useValue: 'en-EN' }的提供者
 target.parameters.push([new core.Inject(provider.provide), provider.useValue || provider.useClass]);
 }
 });
 }
 return target;
 }
}

感谢阅读,欢迎提供任何思路。


补充说明 我的问题与Angular 2 dependency injection in ES5 and ES6不同。因为Angular 4和5之间的依赖注入机制存在差异。

内容的提问来源于stack exchange,提问作者Kevin Balicot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:01:04