角度4静态分析失败,因为“使用值”'提供商

时间:2017-11-06 16:06:31

标签: angular typescript

我收到此错误 -

Error: Error: Error encountered resolving symbol values statically. Calling function 'SecurityModule', function calls are not supported. Consider replacing the function or lambda with a reference to an exported function ...

我已经读过函数调用对于静态分析器来说不能太复杂,但你可以看到这应该是直截了当的。 我不确定为什么会失败。
我已经看过几个使用长格式提供程序对象的示例,根据我的理解,这应该是可以接受的。

这是项目 -
https://github.com/savantly-net/ngx-security

有什么想法?

SecurityModule -

import { ISecurityService } from './ISecurity.service';
import { NgModule, ModuleWithProviders, Optional, SkipSelf, InjectionToken } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UserComponent } from './user/user.component';

export const SECURITY_SERVICE = new InjectionToken<ISecurityService>('security.service');

@NgModule({
  imports: [
    CommonModule
  ],
  exports: [ UserComponent ],
  declarations: [ UserComponent ]
})
export class SecurityModule {

  static forRoot(securityService: ISecurityService): ModuleWithProviders {
    return {
      ngModule: SecurityModule,
      providers: [{
        provide: SECURITY_SERVICE,
        useValue: securityService
      }]
    };
  }

  constructor (@Optional() @SkipSelf() parentModule: SecurityModule) {
    if (parentModule) {
      throw new Error(
        'SecurityModule is already loaded. Import it in the AppModule only');
    }
  }
}

AppModule -

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { SecurityModule, SecurityMockService } from '@savantly/ngx-security';

export const mockSecurity = new SecurityMockService();

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    SecurityModule.forRoot(mockSecurity)
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

SecurityMockService -

@Injectable()
export class SecurityMockService implements ISecurityService {
  logout: () => void;
  login: (username: string, password: string) => boolean;
  user: IUser;

  constructor() {
    this.user = {
      principal: 'demoUser',
      displayName: 'Demo User',
      authenticated: false,
      roles: ['ADMIN', 'USER']
    };

    this.login = (_username: string, _password: string) => {
      this.user.authenticated = true;
      return true;
    };

    this.logout = () => {
      this.user.authenticated = false;
    };
  }
}

3 个答案:

答案 0 :(得分:1)

好的,这是一个简单的解决方法:

使用export const mockSecurity = new SecurityMockService(); SecurityModule.forRoot(mockSecurity) 代替

useClass

接下来是。你真的应该像格雷厄姆所说的那样使用{{1}},因为那会使你的服务实例化成角度。

答案 1 :(得分:0)

如果您要提供课程,则应使用'useClass'而不是'useValue'

答案 2 :(得分:0)

在我的情况下,结果与使用InjectionToken有关,而不是使用&#34; ISecurityService&#34;作为提供价值。

我不确定为什么这是一个问题 不幸的是,我没有时间进一步挖掘。