我收到此错误 -
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;
};
}
}
答案 0 :(得分:1)
好的,这是一个简单的解决方法:
使用export const mockSecurity = new SecurityMockService();
SecurityModule.forRoot(mockSecurity)
代替
useClass
接下来是。你真的应该像格雷厄姆所说的那样使用{{1}},因为那会使你的服务实例化成角度。
答案 1 :(得分:0)
如果您要提供课程,则应使用'useClass'而不是'useValue'
答案 2 :(得分:0)
在我的情况下,结果与使用InjectionToken有关,而不是使用&#34; ISecurityService&#34;作为提供价值。
我不确定为什么这是一个问题 不幸的是,我没有时间进一步挖掘。