Я использую BehaviorSubject для хранения переменной (имя пользователя), которая используется совместно с другими компонентами, и она отлично работает в моих шаблонах для отображения имени пользователя.Тем не менее, я хотел бы иметь возможность использовать значение моего BehaviorSubject в службе, где это значение (имя пользователя) затем используется в качестве параметра для метода, подобного этому: myMethod (username) {do stuff}.
Проблема, похоже, в том, что значение BehaviorSubject не готово при вызове метода.Я попытался вызвать метод как в конструкторе, так и в ngOnInIt, и если я записываю его в консоль, он показывает, что сначала он не определен, а затем в конечном итоге записывает в журнал правильное значение (имя пользователя).Можно ли использовать BehaviorSubject для получения значения, которое вы передаете в качестве аргумента методу?
В моем примере у меня есть auth.service, в котором есть мой BehaviorSubject (не отображает данные для входа / авторизации, потому что это не имеет значения для этого примера).Этот BehaviorSubject затем подписывается в моем newform.component.ts.Я могу отобразить значение в шаблоне newform, но это не то, что я хочу сделать.Я борюсь с тем, чтобы подписаться на это значение BehaviorSubject в newform.component и передать его методу, который вызывает сервис, который должен возвращать массив местоположений на основе имени пользователя.Мне нужен этот массив местоположений для заполнения ввода в шаблоне новой формы, поэтому я пытаюсь вызвать его для ngOnInIt ... чтобы я мог получить местоположения для ввода до того, как пользователь начнет заполнять форму.
Ниже приведен код:
auth.service.ts
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthService {
private accountInfoSource = new BehaviorSubject<any>({});
accountInfoCurrent = this.accountInfoSource.asObservable();
constructor() { }
accountInfoChange(accountName: any) {
this.accountInfoSource.next(accountName)
}
}
newform.component.ts
import { Component, OnInit } from '@angular/core';
import { Locationslist } from '../services/locationslist.service';
import { AuthService } from '../services/auth.service';
@Component({
selector: 'app-new-charge',
templateUrl: './new-charge.component.html',
styleUrls: ['./new-charge.component.css']
})
export class NewChargeComponent implements OnInit {
accountName: string;
locations;
constructor(protected authService: AuthService, private locations: Locationslist) { }
ngOnInit() {
this.getLocations();
}
getLocations() {
this.authService.accountInfoCurrent.subscribe(accountInfo => {
this.accountName = accountInfo.AccountName;
} );
this.locations.getUserLocations(this.accountName) // <=== this.accountName is undefined
.subscribe(foundset => {
this.locations = foundset;
});
}
}
locationlist.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root'
})
export class Valuelists {
constructor(private http: HttpClient, protected authService: AuthService) { }
getUserLocations(accountname) {
let token = localStorage.getItem('token');
let body = '{\"query\": [ { \"AccountName\" : \"=' + accountname + '\"} ] }';
const findLocations = 'https://my.api';
let auth = 'Bearer ' + token;
return this.http.post(findLocations, body, {
headers: new HttpHeaders()
.set('Content-Type', 'application/json')
.set('Access-Control-Allow-Origin', '*')
.set('Authorization', auth)
})
}
}
Я знаю, что служба locationlist работает, если я жестко закодировал "accountname" в аргументе для getUserLocations (accountname).На самом деле сервис location в конечном итоге работает со значением BehaviorSubject, но в консоли я сначала вижу ошибку с HTTP-ответом 500, а затем получаю информацию о местоположении.Здесь снова кажется, что переменная BehaviorSubject обнаруживается поздно.Есть ли способ передать значение BehaviorSubject в качестве аргумента методу или есть лучший способ для достижения моих целей?