Angular Ionic应用程序将JSON转换为数组
我对离子型和角型都很陌生,所以如果这个问题没有多大意义,请原谅 平台:离子3 我有一个提供者:rest.ts如下Angular Ionic应用程序将JSON转换为数组,angular,ionic3,Angular,Ionic3,我对离子型和角型都很陌生,所以如果这个问题没有多大意义,请原谅 平台:离子3 我有一个提供者:rest.ts如下 getLights() { return new Promise(resolve => { this.http.get(this.apiUrl+'/lights').subscribe(data => { resolve(data); }, err => { console.log(err); }); });
getLights() {
return new Promise(resolve => {
this.http.get(this.apiUrl+'/lights').subscribe(data => {
resolve(data);
}, err => {
console.log(err);
});
});
}
这将返回以下数据(敏感信息已删除)
由以下内容组成的爱奥尼亚页面“列表”:list.ts
export class ListPage {
lights: any;
icons: string[];
constructor(public navCtrl: NavController,
public navParams: NavParams,
public restProvider: RestProvider) {
this.getLights();
}
getLights() {
this.restProvider.getLights()
.then(data => {
this.lights = data;
console.log(this.lights);
});
}
}
和list.html:
<ion-content>
<ion-list inset>
<ion-item *ngFor="let light of lights">
<h2>{{light.name}}</h2>
<p>{{light.type}}</p>
</ion-item>
</ion-list>
</ion-content>
{{light.name}
{{light.type}
尽管console log语句正确显示了JSON,但由于以下错误,我无法在list.html中使用ngFor对其进行迭代
找不到类型为“object”的不同支持对象“[object]”。NgFor只支持绑定到数组之类的可重用文件
我意识到我需要将JSON转换成javascript数组,但不确定在哪里或如何转换。非常感谢任何指针。有多种方法可以将类似数组的对象转换为数组,具体取决于它的组成方式。在这种情况下,您可以非常轻松地使用:
data => resolve(Object.keys(data).map(key => data[key]))
这将使用promise中的一个对象数组进行解析,并且应该可以使用您的组件
我要指出的是,你不必使用你自己的承诺,你可以使用可观察的方法
getLights() {
return this.http.get(`${this.apiUrl}/lights`).map(data =>
Object.keys(data).map(key => data[key])
).toPromise();
}
事实上,您甚至不需要使用承诺,只需订阅getLights
this.restProvider.getLights().subscribe(data => {
this.lights = data;
});
注:
如果这不是使用Angular 5,我认为您需要执行以下操作:
this.http.get(url).map(response => response.json())
也在可观察链中。感谢您的上述回复。非常有帮助,但不幸的是我没能让它像我期望的那样工作。。。可能是因为我缺乏经验 我仍然无法回避JSON包含数字作为键并能够在灯光上迭代的问题 但是,我能够投射一个light的响应(修改API调用以获得light“1”): 使用接口:
export interface State {
on: boolean;
bri: number;
alert: string;
reachable: boolean;
}
export interface Swupdate {
state: string;
lastinstall?: any;
}
export interface Light {
state: State;
swupdate: Swupdate;
type: string;
name: string;
modelid: string;
manufacturername: string;
uniqueid: string;
swversion: string;
swconfigid: string;
productid: string;
}
然后使用HttpClient调用强制转换对象,如下所示:
this.http.get<Light>(this.apiUrl+'/lights/1').subscribe(data => {
console.log(data.state.bri);
})
this.http.get(this.apirl+'/lights/1')。订阅(数据=>{
console.log(data.state.bri);
})
如果有人能详细说明一个界面的结构,可以成功地在关键是数字的地方投射出一个灯光列表,那将是理想的
export interface State {
on: boolean;
bri: number;
alert: string;
reachable: boolean;
}
export interface Swupdate {
state: string;
lastinstall?: any;
}
export interface Light {
state: State;
swupdate: Swupdate;
type: string;
name: string;
modelid: string;
manufacturername: string;
uniqueid: string;
swversion: string;
swconfigid: string;
productid: string;
}
this.http.get<Light>(this.apiUrl+'/lights/1').subscribe(data => {
console.log(data.state.bri);
})