Dengan sudut 10, dalam layanan saya memiliki metode getCurrentUser() yang membuat panggilan http ke api saya untuk mengembalikan pengguna saat ini sebagai yang dapat diamati (dengan salah satu properti adalah "isAdmin:boolean"), dan saya memiliki layanan lain ini di mana Saya ingin membuat metode getAllUsers yang akan mengembalikan daftar semua pengguna (pengguna[]) juga dapat diamati tetapi hanya jika pengguna saat ini adalah admin (user.isAdmin = true). Saya mencoba beberapa hal dengan operator rxjs seperti map, switchMap dan flatMap tetapi saya dapat merasa bahwa saya sepenuhnya salah, dapatkah Anda memberikan beberapa petunjuk untuk ini?

Inilah yang saya coba di layanan kedua:

@Injectable({
    providedIn: "root",
})
export class BackofficeService {

    constructor(private http: HttpClient, private userService: UserService) {}

    public getAllUsers(): Observable<User[]> {
        this.userService.getCurrentUser().pipe(
            map((user: User) => {
                if (user.roles.includes("admin")) {
                    return this.http.get<User[]>("/api/settings/users/all");
                } else throw new Error("User not admin.");
            })
        );
    }
}

Saya juga tidak tahu cara mengelola pengembalian getAllUsers() karena terkadang tidak mengembalikan apa pun jika pengguna bukan admin. Dengan sederhana "else throw new Error()" saya mendapatkan kesalahan kompiler karena saya menyatakan bahwa getAllUsers() harus mengembalikan Observable.

Dan kemudian di komponen saya, saya melakukan:

@Component({
    selector: "app-users",
    templateUrl: "./users.component.html",
})
export class UsersComponent implements OnInit {
  public usersList: User[];
  constructor(private boService: BackofficeService) {}

    ngOnInit(): void {
    this.boService
      .getAllUsers()
      .subscribe((users?: User[]) => {
        if(users){
          this.usersList = users;
        }
      })
    }
}
0
Thomas Perrin 14 Januari 2021, 18:46

3 jawaban

Jawaban Terbaik

Bahkan jika posting preseden menjawab pertanyaan saya, saya memposting di sini jawaban lain yang berhasil untuk saya: Saya telah diberitahu bahwa konsepsi yang baik dalam hal ini adalah membuat logika admin dalam penjaga, dan dalam perutean untuk komponen menggunakan backoffice layanan untuk menambahkan penjaga ini. Bekerja dengan baik dan tampaknya praktik yang baik.

0
Thomas Perrin 15 Januari 2021, 08:11

Solusi sederhana adalah mengembalikan null jika pengguna bukan admin, dengan memisahkan dua panggilan (getAdmin() dan getAllUsers()).

@Injectable({
    providedIn: "root",
})
export class BackofficeService {

    constructor(private http: HttpClient, private userService: UserService) {}

    public getAdmin(): Observable<User> {
        return this.userService.getCurrentUser().pipe(
            map((user: User) => {
                if (user.roles.includes("admin")) {
                    return user;
                } else {
                    return null;
                }
            })
        );
    }
    
    public getAllUsers(): Observable<User[]> {
        return this.http
            .get<User[]>("/api/settings/users/all").pipe(
            map((users: User[]) => users);
    }
}

Dan kemudian berlangganan keduanya di komponen, yang kedua hanya jika yang pertama memberikan hasil yang diharapkan:

  ngOnInit(): void {
    this.boService
      .getAdmin()
      .subscribe((user: User) => {
        if (user) {
          this.boService
            .getAllUsers()
            .subscribe((users: User[]) => {
              console.log(users);
            });
        }
      });
  }

Satu kesalahan yang Anda buat adalah menempatkan pengembalian bukan pada Observable tetapi pada hasil Observable.

0
aepifano 14 Januari 2021, 17:42
this.service.getUser().pipe(
  switchMap(user => user.isAdmin
    ? this.service.getAllUsers().pipe(users => [user, users])
    : of([user])
  )
).subscribe(([user, users]) => ... ) // users will be undefined if not admin
0
D Pro 14 Januari 2021, 22:11