我有休息api返回行(这是记录的总数) 和客户端(对象列表)。我想订阅回复。
return Ok(new {rows=count,clients=list});
如果响应返回Ok(clients}); 我可以像下面这样做 Angular2:
private clients: Client[];
this.clientService.read().subscribe(
clients=> this.clients=clients,
如果响应是Angular2中的对象,我该怎么读? 我想了解如何在订阅方法中访问具有多个参数的对象
答案 0 :(得分:1)
this.clientService.read().subscribe( resp =>
this.clients = resp.json().clients;
}
API中的客户端必须具有与Client类相同的格式。
答案 1 :(得分:0)
首先,我不知道您的ClientService做了什么。我建议你使用新的HttpClient
。一种可能的实现方式可能是:
interface Client {
name: string;
etc...
}
interface ClientList {
rows: number;
clients: Client[];
}
@Injectable()
export class ClientService {
constructor(private http: HttpClient) { }
read(): Observable<ClientList> {
return this.http.get<ClientList>('/api/clients');
}
}
然后在你的组件中,你会得到这个:
export class SomeComponent implements OnInit {
clients: Client[];
constructor(private clientService: ClientService ) {}
ngOnInit() {
this.clientService.read().subscribe(clientList => this.clients = clientList.clients);
}
}
在您的组件html中,您可以使用客户端。要打印客户端的调试JSON表示:
{{ clients | json }}
我认为这会泄漏内存,因为您订阅并且永远不会取消订阅。
更好的方法是让角度使用AsyncPipe
来处理订阅和取消订阅。
您的组件将具有类似的可观察属性:
export class SomeComponent implements OnInit {
clients$: Observable<Client[]>;
constructor(private clientService: ClientService ) {}
ngOnInit() {
this.clients$ = this.clientService.read().map(clientList => clientList.clients);
}
}
注意:
名称clients$
以$
结尾 - 这是一个约定,表明它是一个可观察的,是很多人在使用observable时所做的事情。
map()
调用Rxjs并获取行和客户端属性的rid,因此您只拥有数组,因为这是您似乎想要做的事情。
然后在您的模板中,您可以使用以下内容:
{{ clients$ | async | json }}
| async
部分将负责订阅您的Observable,并在您的组件被销毁时取消订阅。当事情发生时,它还会自动检查检测情况,调用markForCheck表示您可以使用OnPush change detection。
这个答案中有很多更高级的主题,所以我建议你google /阅读我发布的链接。