2017-07-08 2 views
0

Ich lerne Observables und versuche, einen Dienst für die Login-Validierung zu implementieren. Dummy-Daten sind wie diesObservables: Validieren Sie Dummy-Daten aus einer Scheinklasse ohne http

export class Users { 
    public users: IUser[] = []; 

    constructor() { 
    this.users = [ 
     new IUser({ username: "protagonist", password: "hello123" }), 
     new IUser({ username: "rono67", password: "[email protected]" }), 
     new IUser({ username: "donaldtrump", password: "[email protected]" })   
    ]; 
    } 

und Struktur des IUser ist wie diese.

export class IUser { 
    usename:string; 
    password:string; 
} 

ich das Bestehen der eingegebenen Benutzernamen und Passwort an die Service-Klasse und ich möchte einen beobachtbaren Ruf haben, die durch die Dummy-Daten durchlaufen, und wenn es die passenden Anmeldeinformationen findet, wird es zurück. Ich möchte keinen HTTP-Anruf tätigen. Methode ist so etwas wie this-

validLogin(accountInfo: IUser): Observable<IUser> { 
     return --------- 
      .map((user:IUser) => user.filter((user:IUser) => user.usernanme == accountInfo.username && user.password == accountInfo.password); 
     } 

Ich bin nicht sicher, was Stück Code ------ im Ort der Rückkehr geschrieben werden muss. Alle Ergebnisse, die ich im Web erhalten habe, implementieren "return this.http.post"

Ist es möglich, RxJs auf Scheindaten anzuwenden? Bitte schlagen Sie vor.

+2

'Observable.of (...)'? Oder Sie können die [In-Memory-Web-API] (https://github.com/angular/in-memory-web-api) verwenden und gegen etwas realistischeres üben. – jonrsharpe

+0

Mögliche Duplikate von [Angular2: Array in Observable konvertieren] (https://StackOverflow.com/questions/35527500/angular2-convert-array-to-Observable) – jonrsharpe

Antwort

1

Sie können Observable.of oder Observable.from verwenden, um ein Observable Objekt aus allem zu erstellen. Da Sie eine Operation auf IUser Array tun wollen, empfehle ich Ihnen Observable.of

Hier verwenden, wie es

export class Users { 
    public users: IUser[] = []; 
    _users: Observable<IUser[]>; 

    constructor() { 
     let users = [ 
     // your dummy data 
     ]; 

     for (let user of users) { 
      this.users.push(new IUser(user)); 
     } 
     this._users = Observable.of(this.users); 
    } 

    validLogin(accountInfo: IUser): Observable<IUser> { 
    return this._users.map((user:IUser) => 
      user.filter((user:IUser) => user.usernanme == accountInfo.username && user.password == accountInfo.password); 
    } 

} 
+0

Hallo, ich bekomme den folgenden Fehler "Observable " ist nicht zuweisbar zum Typ 'Observable ' Typ 'IUser' kann nicht dem Typ 'IUser []' zugewiesen werden Eigenschaft 'Länge' fehlt im Typ 'IUser' – Protagonist

+1

'Observable.from' macht einen beobachtbaren Stream jedes einzelnen Benutzers , nicht das ganze Array wie das OP will – jonrsharpe

+0

@jonrsharpe Wie liest man dann das ganze Array ?? – Protagonist

0

Da Ihr Users Klasse ist bereits ein Mock-Implementierung (die alle Benutzer direkt in eine aussehen würde Array) können Sie einfach wrap the array into an Observable und Filter auf Basis von Benutzern & PWD das erste Ergebnis zurück:

validLogin(accountInfo: IUser): Observable<IUser> { 
    return Rx.Observable.from(users) 
    .filter(dbUser => dbUser.username == accountInfo.username && dbUser.password == accountInfo.password) 
    .take(1);//no user found => observable completes without data 
} 

Abhängig von den aktuellen Implemen Sie möchten vielleicht kein leeres Observable zurückgeben, wenn kein Benutzer mit den korrekten Zugangsdaten gefunden wurde, sondern ein Fehler, der Ihnen überlassen bleibt.

Verwandte Themen