如何从响应中获取angular2中的数据,该响应返回后端中的对象?

时间:2017-10-27 16:33:43

标签: c# angular

我有休息api返回行(这是记录的总数) 和客户端(对象列表)。我想订阅回复。

return Ok(new {rows=count,clients=list});

如果响应返回Ok(clients}); 我可以像下面这样做 Angular2:

private clients: Client[];
this.clientService.read().subscribe(
      clients=> this.clients=clients, 

如果响应是Angular2中的对象,我该怎么读? 我想了解如何在订阅方法中访问具有多个参数的对象

2 个答案:

答案 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 /阅读我发布的链接。

相关问题