Chaque fois que je génère quelque chose dans mon dossier partagé, le fichier index.ts est reconstruit et les exportations sont classées par ordre alphabétique. Cela semble casser les dépendances pour moi. En changeant l'ordre manuellement pour que les dépendances soient exportées avant les classes avec les dépendances, cela fonctionne à nouveau.
Si nous avons app/shared/auth.guard.ts
:
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AuthService, User } from './';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private accountService: AuthService, private router: Router) { }
canActivate(next: ActivatedRouteSnapshot): Observable<boolean> {
let result = this.accountService.currentUser.first().map(user => user != null);
let route: any[] = ['/login'];
if (next.url.length) {
route.push({ redirectUrl: next.url });
}
result.subscribe(isLoggedIn => {
if (!isLoggedIn) {
this.router.navigate(route);
}
});
return result;
}
}
et app/shared/account.service.ts
:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { User } from './';
const LOCAL_STORAGE_KEY = 'currentUser';
@Injectable()
export class AuthService {
private currentUserSubject: BehaviorSubject<User>;
constructor() {
this.currentUserSubject = new BehaviorSubject<User>(this.getUserFromLocalStorage())
this.currentUserSubject.subscribe(user => this.setUserToLocalStorage(user));
}
logIn(userName: string, password: string) : Observable<User> {
this.currentUserSubject.next({
id: userName,
userName: userName,
email: userName
});
return this.currentUser.first();
}
logOut() {
this.currentUserSubject.next(null);
}
get currentUser(): Observable<User> {
return this.currentUserSubject.asObservable();
}
private getUserFromLocalStorage(): User {
let userString = localStorage.getItem(LOCAL_STORAGE_KEY);
if (!userString) {
return null;
}
return JSON.parse(userString);
}
private setUserToLocalStorage(user: User) {
if (user) {
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(user));
}
else {
localStorage.removeItem(LOCAL_STORAGE_KEY);
}
}
}
Ça ne marche pas :
export * from './auth.guard';
export * from './auth.service';
Unhandled Promise rejection: Error: Cannot resolve all parameters for 'AuthGuard'(undefined, Router). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'AuthGuard' is decorated with Injectable.
Ça marche :
export * from './auth.service';
export * from './auth.guard';
D'après ce que j'ai remarqué, cela ne s'applique pas à tous. Par exemple, mon modèle d'utilisateur peut être exporté après le service d'authentification et il fonctionne bien.
J'aimerais ne pas avoir à le modifier manuellement à chaque fois. Existe-t-il une solution de contournement ? Pourrais-je structurer les fichiers d'une manière différente ?
Dépendances de package.json
:
"@angular/common": "^2.0.0-rc.2",
"@angular/compiler": "^2.0.0-rc.2",
"@angular/core": "^2.0.0-rc.2",
"@angular/forms": "^0.1.0",
"@angular/http": "^2.0.0-rc.2",
"@angular/platform-browser": "^2.0.0-rc.2",
"@angular/platform-browser-dynamic": "^2.0.0-rc.2",
"@angular/router": "^3.0.0-alpha.7",
"bootstrap": "^3.3.6",
"es6-shim": "0.35.1",
"moment": "^2.13.0",
"ng2-bootstrap": "^1.0.17",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.6",
"slideout": "^0.1.12",
"systemjs": "0.19.26",
"zone.js": "0.6.12"
DevDependencies :
"angular-cli": "1.0.0-beta.6"