2017-02-07 3 views
0

У меня есть следующие службы определена:службы 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 определен как в компоненте, так и в модуле, но в моем случае модуль является единственным местом, где это определено.

+0

Вопрос заключается в проблеме XY, и предположение, что оно не является одиночным, приводит неверные ответы.Из вышеприведенного кода это не может быть ничего, кроме singleton. Если у вас есть сомнения по поводу этого, пожалуйста, проверьте это, подвергая '_userService' глобальным переменным и проверяя, равны ли они, вы единственный, кто может это сделать. Этот вопрос требует [MCVE] (http://stackoverflow.com/help/mcve). – estus

+0

Я думал, что код в конструкторе выстрелил не один раз, указав, что это не синглтон? – jazza1000

+0

Если у вас есть '' в конструкторе '' только в одном месте, то да. Тот факт, что у вас есть синтаксическая ошибка в 'constructor (private _http: Http) {console.log (" in the constructor ";}', говорит о том, что реальный код отличается от кода, который вы опубликовали каким-то образом. MCVE необходим для вопрос, который не считается оффтопическим, может помочь плут скрипки. Из того, что я знаю о A2 DI, невозможно иметь разные экземпляры, если у вас нет 'провайдеров: [UserService]' где-то еще. – estus

ответ

0

Решение было найдено в следующем StackOverflow:

Angular2 router.navigate refresh page

Это привело меня, чтобы проверить его в Internet Explorer, который работал нормально (он не работал в Chrome)

Оказалась, что вся страница была освежающая, когда следующая строка была выполнена:

this.router.navigate([this.returnUrl]); 

Который причиняли обслуживание пользователей снова перезагружать, потому что без типа на кнопке, действие Chrome по умолчанию было лечить нажмите кнопку «Отправить».

Исправление было добавить тип = «кнопка» тег на кнопку для входа в HTML

<button type="button" class="btn btn-primary"(click)="validateUser(username, password)">Login</button> 

Он теперь работает во всех браузерах.

0

Не знаю, как это выглядит, как сейчас, но в Angular2 rc.4 я мог бы использовать этот подход:

bootstrap.ts

import {AppComponent} from './components/AppComponent; 
import { singletonServiceNr1, singletonServiceNr2) from './services/Services; 

let singletonServices = [ 
    singletonServiceNr1, 
    singletonServiceNr2 
]; 

bootstrap(AppComponent, [singletonServices]); 

Чем вы впрыснуть singletonServiceNr1 или singletonServiceNr2 в нужном компоненте в обычный способ. Сейчас они одиночные.


В вашем случае вы должны Propably делать то же самое:

@NgModule({ 
declarations: [ 
AppComponent, 
LoginComponent, 
HomeComponent, 
ManageUsersComponent, 
StandingDataComponent 
], 
imports: [ 
BrowserModule, 
FormsModule, 
HttpModule, 
AppRoutingModule 
], 
providers: [AuthGuard,UserService], 
bootstrap: [AppComponent, UserService]  // note the change here 
}) 
export class AppModule { } 
+0

Я получаю ошибка, когда я делаю это «Отказ от необработанного обещания: компонент UserService не является частью какого-либо NgModule, или модуль не был импортирован в ваш модуль» – jazza1000

+0

Echh, как я уже сказал, я еще не в моду, поэтому я не могу ответьте на свой вопрос. Я все еще застрял на rc4. –

Смежные вопросы