无法从服务 Angular 5 中获取 属性
Can't get property from service Angular 5
我在一个星期内通过创建一个简单的网上商店学习了 Angular。我还在基础上,我正在尝试加载一个包含来自 REST 服务的数据的菜单。为此,我使用以下配置:
categories.services.ts
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
@Injectable()
export class CategoriesService {
private categories = [];
constructor(private http: Http){
this.setCategories();
};
setCategories(){
if (this.categories != []){
this.http.get('http://someurl:1234/someapi/somevalue')
.toPromise()
.then((data) => {
console.log('inside');
console.log(data.json().response);
this.categories = data.json().response;
})
.catch((err) => {
console.log(err);
})
}
}
function getCategories(){
return this.categories;
}
}
main.component.ts
import { Component, OnInit, Inject } from '@angular/core';
import { CategoriesService } from '../categories/categories.service';
@Component({
selector: 'app-main',
templateUrl: './main.component.html',
styleUrls: ['./main.component.css']
})
export class MainComponent{
categories = [];
constructor(private cat:CategoriesService){
this.categories = cat.getCategories;
console.log(this.categories);
}
notify(private new_categories){
this.categories = new_categories;
}
}
这里的问题是 在 Web 控制台中我可以按预期看到 REST 服务的响应,但是组件内的日志打印一个空数组。谢谢你,对不起我的英语
调用函数时漏了括号,应该是这样的,
constructor(private cat:CategoriesService){
this.categories = cat.getCategories(); //check this line
console.log(this.categories);
}
这是异步的,所以最有可能发生的情况是,当您调用 getCategories
时,变量 categories
还没有值。我们通常做的,是直接在组件中订阅请求,所以修改你的代码为:
服务:
@Injectable()
export class CategoriesService {
constructor(private http: Http){ }
getCategories(){
return this.http.get('http://someurl:1234/someapi/somevalue')
.map(res => res.json().response)
}
}
组件:
categories = [];
constructor(private cat:CategoriesService){ }
ngOnInit() {
this.cat.getCategories()
.subscribe(data => {
this.categories = data;
console.log(this.categories)
})
}
如果您希望在 "it has been done before" 时不发出请求,请在服务中使用变量,在发出 http 请求之前检查它是否具有值,否则 return 将其作为 Observable .组件保持不变,它只是订阅来自服务的 Observable,不知道它是否是 http 请求的结果。
符合以下内容:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/do';
@Injectable()
export class CategoriesService {
private categories = [];
constructor(private http: Http){ }
getCategories(){
if(this.categories.length) {
return Observable.of(this.categories)
} else {
return this.http.get('http://someurl:1234/someapi/somevalue')
.do(res => this.categories = res.json().response)
.map(res => res.json().response)
}
}
}
同时考虑使用 HttpClient
而不是 Http
,因为 Http
已被弃用。
我在一个星期内通过创建一个简单的网上商店学习了 Angular。我还在基础上,我正在尝试加载一个包含来自 REST 服务的数据的菜单。为此,我使用以下配置:
categories.services.ts
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
@Injectable()
export class CategoriesService {
private categories = [];
constructor(private http: Http){
this.setCategories();
};
setCategories(){
if (this.categories != []){
this.http.get('http://someurl:1234/someapi/somevalue')
.toPromise()
.then((data) => {
console.log('inside');
console.log(data.json().response);
this.categories = data.json().response;
})
.catch((err) => {
console.log(err);
})
}
}
function getCategories(){
return this.categories;
}
}
main.component.ts
import { Component, OnInit, Inject } from '@angular/core';
import { CategoriesService } from '../categories/categories.service';
@Component({
selector: 'app-main',
templateUrl: './main.component.html',
styleUrls: ['./main.component.css']
})
export class MainComponent{
categories = [];
constructor(private cat:CategoriesService){
this.categories = cat.getCategories;
console.log(this.categories);
}
notify(private new_categories){
this.categories = new_categories;
}
}
这里的问题是 在 Web 控制台中我可以按预期看到 REST 服务的响应,但是组件内的日志打印一个空数组。谢谢你,对不起我的英语
调用函数时漏了括号,应该是这样的,
constructor(private cat:CategoriesService){
this.categories = cat.getCategories(); //check this line
console.log(this.categories);
}
这是异步的,所以最有可能发生的情况是,当您调用 getCategories
时,变量 categories
还没有值。我们通常做的,是直接在组件中订阅请求,所以修改你的代码为:
服务:
@Injectable()
export class CategoriesService {
constructor(private http: Http){ }
getCategories(){
return this.http.get('http://someurl:1234/someapi/somevalue')
.map(res => res.json().response)
}
}
组件:
categories = [];
constructor(private cat:CategoriesService){ }
ngOnInit() {
this.cat.getCategories()
.subscribe(data => {
this.categories = data;
console.log(this.categories)
})
}
如果您希望在 "it has been done before" 时不发出请求,请在服务中使用变量,在发出 http 请求之前检查它是否具有值,否则 return 将其作为 Observable .组件保持不变,它只是订阅来自服务的 Observable,不知道它是否是 http 请求的结果。
符合以下内容:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/do';
@Injectable()
export class CategoriesService {
private categories = [];
constructor(private http: Http){ }
getCategories(){
if(this.categories.length) {
return Observable.of(this.categories)
} else {
return this.http.get('http://someurl:1234/someapi/somevalue')
.do(res => this.categories = res.json().response)
.map(res => res.json().response)
}
}
}
同时考虑使用 HttpClient
而不是 Http
,因为 Http
已被弃用。