У меня есть следующие службы определена:службы Angular2 не впрыскивается, как одноплодная
@Injectable()
export class UserService {
private _users: User[] = []
private _currentUser:User;
///Creates an instance of the Angular2 Http Service
constructor(private _http: Http) {console.log("in the constructor"; }
Это вызывается из компонента входа:
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
returnUrl: string;
constructor(private _userService: UserService,
private route: ActivatedRoute,
private router: Router) { }
validateUser(username: string, password: string): boolean {
var loggedOnUser = this._userService.checkLogin(username, password);
...//check if logged on
this.router.navigate([this.returnUrl]);
return true;
}
Однако, когда есть успешный Логин, он перенаправляет на домашний маршрут, а защита аутентификации запускает новый экземпляр службы пользователя, который, поскольку он является новым экземпляром, возвращает неопределенный для аутентифицированного пользователя
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router, private _userService: UserService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this._userService.getAuthenticatedUser()) //is undefined?????
{
return true;
}
// not logged in so redirect to login page with the return url
this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
return false;
}
}
Мой модуль объявлен следующим образом:
@NgModule({
declarations: [
AppComponent,
LoginComponent,
HomeComponent,
ManageUsersComponent,
StandingDataComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
AppRoutingModule
],
providers: [AuthGuard,UserService],
bootstrap: [AppComponent]
})
export class AppModule { }
Мой класс маршрутизации состоит в следующем:
const appRoutes: Routes = [
{path: '', component: HomeComponent, canActivate:[AuthGuard]},
{ path: 'login', component: LoginComponent },
{path: 'home',
component:HomeComponent, canActivate:[AuthGuard],
children: [{path: 'manageusers', component: ManageUsersComponent, outlet: 'innerPage'},
{path: 'standingdata', component: StandingDataComponent, outlet: 'innerPage'}]
},
// otherwise redirect to home
{ path: '**', redirectTo: '' }];
@NgModule({
imports: [RouterModule.forRoot(appRoutes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Код конструктора абонентское увольняет и когда страница Войти хит, и при успешном происходит аутентификация.
Я понимаю, что такая проблема возникает, когда UserService определен как в компоненте, так и в модуле, но в моем случае модуль является единственным местом, где это определено.
Вопрос заключается в проблеме XY, и предположение, что оно не является одиночным, приводит неверные ответы.Из вышеприведенного кода это не может быть ничего, кроме singleton. Если у вас есть сомнения по поводу этого, пожалуйста, проверьте это, подвергая '_userService' глобальным переменным и проверяя, равны ли они, вы единственный, кто может это сделать. Этот вопрос требует [MCVE] (http://stackoverflow.com/help/mcve). – estus
Я думал, что код в конструкторе выстрелил не один раз, указав, что это не синглтон? – jazza1000
Если у вас есть '' в конструкторе '' только в одном месте, то да. Тот факт, что у вас есть синтаксическая ошибка в 'constructor (private _http: Http) {console.log (" in the constructor ";}', говорит о том, что реальный код отличается от кода, который вы опубликовали каким-то образом. MCVE необходим для вопрос, который не считается оффтопическим, может помочь плут скрипки. Из того, что я знаю о A2 DI, невозможно иметь разные экземпляры, если у вас нет 'провайдеров: [UserService]' где-то еще. – estus