首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法以角度访问API中的子接口数据。我做错了什么?

无法以角度访问API中的子接口数据。我做错了什么?
EN

Stack Overflow用户
提问于 2019-03-08 06:14:54
回答 3查看 94关注 0票数 1

新到角7在这里,需要一些帮助。所以我有一个JSON流,如下所示:

代码语言:javascript
复制
{
    "Id": 25,
    "Name": "XYZ Corp",
    "CompanyAddresses": [
        {
            "Id": 39,
            "CompanyId": 25,
            "Address1": "998 Roosevelt Court",
            ...
        }
    ]
}

company.ts & companyaddress.ts:我创建了两个角度界面,如下所示:

代码语言:javascript
复制
import { CompanyAddresses } from './company-address';
export interface Company {
    Id: number;
    Name: string;
    CompanyAddress: CompanyAddress[];
}
export interface CompanyAddress {
    Id: number;
    CompanyId: number;
    Address1: string;
}

company.service.ts:然后我使用一个服务来填充接口,如下所示:

代码语言:javascript
复制
  getCompany(id): Observable<Company> {
    return this.http.get<Company>(this.baseUrl + 'company/' + id, httpOptions);
  }

company.component.ts:然后调用组件中的服务:

代码语言:javascript
复制
  company: Company;
  constructor(private companyService: CompanyService) {}
  ngOnInit() {
    this.activatedRoute.data.subscribe(data => {
      this.company = data['company'];
    });
  }

现在我的问题是。在组件的HTML中,我可以使用{{company.Name}访问公司名称,但如果我尝试访问CompanyAddress中的任何数据(例如,{company.CompanyAddress.Address1}),则无法这样做。这些财产根本不存在。

在将JSON数据转储到Company接口之前,是否需要在某个时候初始化CompanyAddress接口?

有更好的方法来完成我想做的事吗?也许可以用相同格式的PUT来轻松地保存更改?什么是最佳做法?

编辑:添加HTML模板代码

代码语言:javascript
复制
<div><h3>{{company.Name}}</h3>
<p>
    <div *ngFor="let addy of company.CompanyAddress">
        {{addy.Address1}}
    </div>
</p>    
</div>

我还应该提到,我使用的是Visual代码,它没有显示CompanyAddress中的任何属性。

下面是ASP.Net Core2.1控制器代码:

代码语言:javascript
复制
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class CompanyController : ControllerBase
{
    [HttpGet("{id}")]
    public async Task<IActionResult> Company(int id)
    {
        var company = await _repo.GetCompany(id);
        var companyToReturn = _mapper.Map<CompanyForContactDto>(company);
        return Ok(companyToReturn);
    }
}

据邮递员说,所有的东西都检查过了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-08 06:47:54

@ThaKidd KG5ORD,试试这个

我认为您的JSON object可以用于first interface,但是对于child interface数据,它并不是在转换为JSON object。也许它仍然是一个字符串,所以,做一些如下更改

Component.ts中添加一个方法

代码语言:javascript
复制
ConvertToJSON(product: any) {
    return JSON.parse(product);
}

component.html

代码语言:javascript
复制
<div *ngFor="let addy of ConvertToJSON(company.CompanyAddress)">
        {{addy.Address1}}
</div>

我曾经回答过类似的question here检查过一次。

票数 1
EN

Stack Overflow用户

发布于 2019-03-08 06:25:23

在您的服务端和组件端,一切看起来都很好。我认为您会收到这个错误,因为当您导航到您的(模板)页面时,您正在尝试在服务响应之前呈现company变量。

我的预测是你不会在模板端使用*ngIf子句,

例如,

代码语言:javascript
复制
<div *ngIf="emp1">
  Id:{{emp1.id}} Name: {{emp1.name}}
</div>
<div *ngIf="emp2">
  Id:{{emp2.id}} Name: {{emp2.name}}
</div>  

我明天也回答了类似的问题,请check it。希望能帮上忙。

更新:

请试试这个,

代码语言:javascript
复制
<div *ngIf="company && company.CompanyAddress">
 <h3>{{company.Name}}</h3>
  <p>
    <div *ngFor="let addy of company.CompanyAddress">
        {{addy.Address1}}
    </div>
  </p>    
</div>
票数 1
EN

Stack Overflow用户

发布于 2019-03-08 07:53:18

弄明白了!通过在Produces("application/json")核心API控制器之上添加以下内容,解决了这个问题: ASP.Net

代码语言:javascript
复制
[Authorize]
[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class CompanyController : ControllerBase
{
    [HttpGet("{id}")]
    public async Task<IActionResult> Company(int id)
    {
        var company = await _repo.GetCompany(id);
        var companyToReturn = _mapper.Map<CompanyForContactDto>(company);
        return Ok(companyToReturn);
    }
}

完成此操作后,我将HTML组件更改为:

代码语言:javascript
复制
<div><h3>{{company.Name}}</h3>
<p>
    <div *ngFor="let addy of company.CompanyAddress">
        {{addy.Address1}}
    </div>
</p>    
</div>

感谢你让我走上了一个糟糕的Json的轨道。这也是在更改之后开始工作的:

代码语言:javascript
复制
{{company.CompanyAddress[1].Address1}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55057704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档