2017-10-19 15 views
1

J'ai cette classe simple:Angular2 - comment mélanger la coutume et a déclaré arguments dans le constructeur

import {Router} from '@angular/router'; 

export class NotLogged { 
    constructor(error, private router: Router) { 
     alert('Not logged in !'); 
     this.router.navigate(['/']); 
    } 
} 

Et puis je suis en train de l'appeler d'un service:

if(error.status === 401) 
    return Observable.throw(new NotLogged(error.json())); 

Bien sûr, je obtenez une erreur Supplied parameters do not match any signature of call target. Comment puis je faire ça ?

Merci d'avance.

+1

On dirait qu'il est supposé être 'class NotLogged extends Error'. Et ce serait l'erreur elle-même. La conception de la classe a mal tourné. 'router.navigate' renvoie une promesse et ne devrait pas être perdue car elle peut être utile pour le flux de contrôle. Évidemment, une promesse ne peut pas non plus être retournée à partir d'une classe d'erreur. – estus

+0

3 des réponses sont bonnes, j'ai choisi le plus clair pour moi, et a augmenté tous les 3. Merci. –

Répondre

1

La classe ne hérite d'un autre et n'est pas censé avoir super. S'il est censé être Error sous-classe, router instance doit être passé d'un service où la classe est instancié:

new NotLogged(error.json(), router) 

Habituellement classes qui sont censées utiliser angulaire DI ne doit pas être construit manuellement. Dans ce cas, il peut s'agir d'une instance de classe existante qui sera utilisée dans l'application, et non d'une classe elle-même. En outre, une promesse router.navigate rendement est précieux et ne doit pas être mis au rebut:

@Injectable() 
export class NotLogged { 
    constructor(private router: Router) {} 

    notLogged(error) { 
     alert('Not logged in !'); 
     return this.router.navigate(['/']); 
    } 
} 

A ce stade, il devient évident que la conception de classe a mal tourné, et notLogged devrait appartenir à ne pas seulement une classe, mais à un service fait quelque chose en dehors de la déconnexion, par exemple Auth.

1
constructeur

devrait être,

constructor(private error : any, private router: Router) { 
+0

Merci, vous avez raison, mais il ne se débarrasse pas de l'erreur de compilation –

1

Je rajouterais routeur en tant que dépendance au service et l'injecter manuellement.

Mais l'utilisation de votre classe est un peu étrange, pourquoi voudriez-vous rediriger dans le constructeur d'une classe de données/erreur. Peut-être que la meilleure solution est de supprimer le routeur de la classe et vérifier cette classe d'erreur dans le consommateur du service (probablement un composant) et de rediriger si nécessaire. Cela aide également à séparer votre logique d'affichage (redirection) de votre logique métier.

1

Je ne comprends pas pourquoi vous appelez super(); dans une classe non-dérivée. Pour la question, vous devez utiliser une méthode différente pour obtenir l'objet de votre classe.

export class NotLogged { 
    constructor(private router: Router) { 

    } 

    proceedWithError(error:any){   
     alert('Not logged in !'); 
     this.router.navigate(['/']); 
     return this; 
    } 
} 

alors vous pouvez utiliser cette méthode pour faire le nécessaire.

if(error.status === 401) 
    return Observable.throw(new NotLogged().proceedWithError(error.json());