【问题标题】:Angular 4 Can't resolve all parameters for Service: ([object Object], ?)Angular 4无法解析服务的所有参数:([object Object],?)
【发布时间】:2018-08-29 19:17:08
【问题描述】:

我尝试了来自 SO 和 github 问题的所有变体。

问题:我从私有 npm 存储库中获得了自定义模块。本模块由 angular-cli 制作,由 ng-packagr 发布。

我的项目是使用@ngtools/webpack 构建的。只需代码:

app.module.ts

import { MyHeaderModule } from 'my-header/src/app/modules/my-header/my-header.module';
import { PORTAL_URL, MAINHOME_URL, CURRENT_USER_LOGIN } from 'my-header/src/app/modules/my-base/base.service';

function initConfigFactory() {
   return Promise.resolve("login");
}

@NgModule({
  imports: [ BrowserModule, FormsModule, HttpModule, JsonpModule, RouterModule.forRoot(RoutesConfig), MyHeaderModule.forRoot()],
  declarations: (<any> [ AppComponent ]).concat(Object.values(Components), Object.values(Directives), Object.values(Pipes)),
  providers: (<any> Object.values(Services)).concat([
    DatePipe,
    { provide: LOCALE_ID, useValue: "ru-RU" },
    { provide: PORTAL_URL, useValue: environment.portalUrl },
    { provide: MAINHOME_URL, useValue: environment.mainHomeUrl },
    { provide: CURRENT_USER_LOGIN, useFactory: initConfigFactory, multi: true }
  ]),
  bootstrap: [ AppComponent ],
  schemas: [ NO_ERRORS_SCHEMA ]
})
export class AppModule {}

navigation.service.ts

import { BaseService, PORTAL_URL, MAINHOME_URL, CURRENT_USER_LOGIN } from '../my-base/base.service';
@Injectable()
export class NavigationService extends BaseService {

    protected serviceUrl = this.mainHomeUrl + '/api/v1.0/navigation';

    constructor(protected http: Http,
        @Inject(PORTAL_URL) public portalUrl: string,
        @Inject(MAINHOME_URL) public mainHomeUrl: string,
        @Inject(CURRENT_USER_LOGIN) public userLogin: any
    ) {
        super(http, portalUrl, mainHomeUrl);
    }
    ...
}

base.service.ts

export const PORTAL_URL = new InjectionToken<string>('');
export const MAINHOME_URL = new InjectionToken<string>('');
export const CURRENT_USER_LOGIN = new InjectionToken<Function>(null);

@Injectable()
export abstract class BaseService {...}

那就给我

错误:无法解析 NavigationService 的所有参数:([object Object], [object Object], [object Object], ?)

【问题讨论】:

  • 似乎没有在 app.module 的提供程序中列出CURRENT_USER_LOGIN 是问题的一部分。我从未尝试过使用容器提供函数,所以我不知道这是否可行。您是否在另一个模块中提供CURRENT_USER_LOGIN
  • 我试过这个变种。错误是一样的
  • 好吧,当 定义为 Function 时,我不太确定 InjectionToken 是否可以包含 null。如果替换 export const CURRENT_USER_LOGIN = new InjectionToken(null); 会发生什么错误?通过 export const CURRENT_USER_LOGIN = new InjectionToken('');代替?
  • 我可以试试这个,但不能将此修复添加到此模块存储库中。使用此模块的所有其他项目都没有此错误。我认为重点是我的项目没有使用 angular-cli。

标签: angular typescript webpack dependency-injection webpack-dev-server


【解决方案1】:

import { MyHeaderModule } from 'my-header/src/app/modules/my-header/my-header.module';
import { PORTAL_URL, MAINHOME_URL } from 'my-header/src/app/modules/my-base/base.service';


@NgModule({
  imports: [ BrowserModule, FormsModule, HttpModule, JsonpModule, RouterModule.forRoot(RoutesConfig), MyHeaderModule.forRoot()],
  declarations: (<any> [ AppComponent ]).concat(Object.values(Components), Object.values(Directives), Object.values(Pipes)),
  providers: (<any> Object.values(Services)).concat([
    DatePipe,
    { provide: LOCALE_ID, useValue: "ru-RU" },
    { provide: PORTAL_URL, useValue: environment.portalUrl },
    { provide: MAINHOME_URL, useValue: environment.mainHomeUrl },
    // You are missing this line right here:
    { provide: CURRENT_USER_LOGIN, useValue: environment.currentUserLogin },
  ]),
  bootstrap: [ AppComponent ],
  schemas: [ NO_ERRORS_SCHEMA ]
})
export class AppModule {}

【讨论】:

  • 不,我已经检查了这个选项,但它没有给出结果。错误是一样的。
猜你喜欢
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2020-04-22
  • 1970-01-01
  • 2018-05-10
  • 2018-04-12
相关资源
最近更新 更多