Не удается присвоить значение переменной с помощью метода subscribe() в Angular 2
обещание возвращает значение, но я, похоже, не назначаю значение должным образом в методе subscribe.
import { Component } from '@angular/core';
import { DataService } from '../../shared/data.service';
@Component({
selector: 'topbar',
templateUrl: './src/app/components/topbar/topbar.component.html',
styleUrls: ['./src/app/components/topbar/topbar.component.css'],
providers: [DataService]
})
export class TopbarComponent {
companyCount;
constructor (private dataService: DataService){
dataService.getCompaniesCount().subscribe(res => this.companyCount = res.count); //doesn't work
dataService.getCompaniesCount().subscribe(res => console.log(res.count)); //works
}
}
2 ответов
этот код
export class TopbarComponent {
companyCount;
constructor (private dataService: DataService){
dataService.getCompaniesCount().subscribe(res => this.companyCount = res.count); //doesn't work
dataService.getCompaniesCount().subscribe(res => console.log(res.count)); //works
}
}
res => this.companyCount = res.count
не выполняется немедленно.
Когда getCompaniesCount()
делает запрос на сервер, он принимает долго время до прибытия ответа и наблюдаемых вызовов функция передается в subscribe(...)
(res => this.companyCount = res.count
).
выполнение конструктора, ngOnInit
, ngAfterViewInit()
и многое другое произойдет до того, как придет ответ.
вы можете ознакомиться
subscribe(res => this.companyCount = res.count)
Как регистрации обработчик событий, вызываемый при возникновении события.
весь код, который зависит от данных должен быть правильно соединены.
самый простой способ-перейти к коду в subscribe(...)
constructor (private dataService: DataService){
dataService.getCompaniesCount().subscribe(res => {
this.companyCount = res.count);
// more code that depends on `res.count` being set goes here
});
dataService.getCompaniesCount().subscribe(res => console.log(res.count)); //works
}
Я понимаю, что нить старое. Так это для новых пользователей, которые пытаются сейчас. Я не уверен, что это то, что вы ищете. Но мы можем сохранять данные в компонентной переменной, хотя и уродливый обходной путь. Вот как мы использовали в образце POC
(пожалуйста, используйте правильные крючки как subsribing к обозримому не популярен в конструктор)
@Component({
selector: 'app-search-promo',
templateUrl: './search-promo.component.html',
styleUrls: ['./search-promo.component.css']
})
export class SearchPromoComponent implements AfterViewInit {
searchGroup: FormGroup;
stringify = require('json-stringify-safe');
someResult:any;
resp:Response;
localInput = new FormControl('', Validators.required);
consumedPromoList: Observable<Promotion[]>;
constructor(private searchService: SearchService, fb: FormBuilder) {
this.searchGroup = fb.group({
'localInput': this.localInput
});
this.stringify = require('json-stringify-safe');
this.searchService.getPromoList().subscribe(
resp => {
this.someResult = <Promotion[]>resp;
console.log("Inside sub in comp"+this.stringify(resp));
console.log("before calling the methid");
this.callDto(<Promotion[]>resp);
}
);
console.log('inside const()' + this.stringify(this.someResult));
}
callDto(data){
console.log("caling"+data);
this.someResult = <Promotion[]>data;
console.log("Now priting:"+this.someResult);
this.anotherMethod();
}
anotherMethod(){
console.log("Inside another method"+this.stringify(this.someResult));
}
}
Это был образец компонента, а ниже приведен пример службы
@Injectable()
export class SearchService {
getUrl: String = './../assets/promotionList.json';
subject: BehaviorSubject<Promotion[]> = new BehaviorSubject([]); // initialize with an empty response[]
subjectAsObservable;
someResult;
promoList:Promotion[];
constructor(private http: HttpClient) {
this.getPromoList();
console.log("after first");
this.getPromoValues();
console.log("after second call");
}
getPromoList(){
// by default it emits a response of Json and hence Observabpe<PromotionList>
// throws an error
this.someResult = this.http.get(`${this.getUrl}`);
console.log("before map"+<Observable<Promotion[]>> this.someResult);
return (<Observable<Promotion[]>> this.someResult);
//console.log("first subsriber"+JSON.stringify (this.someResult);
}