【问题标题】:Getting relational data with Angular cli front-end stuck使用 Angular cli 前端卡住获取关系数据
【发布时间】:2017-12-18 11:03:19
【问题描述】:

后端和 Typescript 工作正常,因为在浏览器网络选项卡中我得到了我想要的,我的问题是我被困在 html 中......我不知道如何显示数据。

这是我从 Web api 2 进入控制台的内容:

{
 "Id":1,
 "Name":"testete",
 "Description":"Test",
 "DueDate":"2017-1205T15:14:27.307",
 "IsCompleted":true,
 "Worker":
 [ 
  {
    "Id":1,
    "FirstName":"Johnny",
    "LastName":"Doe",
    "Job":[]
  },
  {"Id":2,"FirstName":"yyyy","LastName":"yyyyy","Job":[]},
  {"Id":3,"FirstName":"bbbbb","LastName":"vvvvvvvv","Job":[]
  }
 ]

}

这是我的模型,以防万一:

export class Jobs {
Id: number;
Name: string;
Description: string;
DueDate: Date;
IsCompleted?: boolean;

worker: Worker[];

}

这是我在 html 组件中显示数据的尝试:

<label class="labelInputs">Workers Assigned to this job</label>
<div *ngFor="let job of jobs">
    <div *ngFor="let worker of job.worker">
        <label class="labelInputs" value="worker">
            {{worker.FirstName}}
        </label>
     </div>
</div>

我收到此错误:ERROR Error: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

这可能会产生误导,因为我什至不知道如何显示嵌套的内容,所以如果有人能告诉我,我将不胜感激。

我只想在“工人”中存在的标签中显示工人的名字。

非常感谢

编辑: 这就是我获得工作的方式。

getJobs(): void {
    const id = +this.route.snapshot.paramMap.get('id');
    this.jobsService.getJob(id)
        .subscribe(jobs => this.jobs = jobs);
}

这是我的服务:

getJob(id: number): Observable<Jobs> {
    const url = `${this.apiURL}/${id}`;

    return this.http.get<Jobs>(url);
}

这里将 Jobs 和 Workers 初始化为数组或对象:

@Input() jobs: Jobs;

public Job: Jobs;
public Jobs: Jobs[];

public workers: Worker[];
public worker: Worker;

【问题讨论】:

  • jobs = Array&lt;Jobs&gt;()在哪里?

标签: angular typescript asp.net-web-api2


【解决方案1】:

我认为您想排除您的第一个 *ngFor 循环,因为您无法迭代对象。

<label class="labelInputs">Workers Assigned to this job</label>
<div *ngFor="let worker of Jobs.worker">
    <label class="labelInputs" value="worker">
         {{worker.FirstName}}
    </label>
</div>

您还需要填充 Jobs 和 Workers。

所以……

export class Jobs {
...
  constructor(){
   this.Workers = new Array<Worker>();
  }
}

然后您需要添加从服务器收到的数据,例如:

job = new Jobs();
for each(var worker in data.Worker){
   Job.Workers.push(worker as Worker);
}

更新:

这是一个有效的plunkr,它更好地证明了这一点。

【讨论】:

  • 我觉得你是对的,但我对 Angular 很不满意。所以我在我的 ts 组件中定义了这个 Jobs: Jobs[]; 或类似这个 jobs = Array&lt;Jobs&gt;() 并且在这个 Jobs.worker 中说“未定义工人”。如果我这样做` Job: Jobs;` 我的智能正在看到工人,但在这里:{{worker.FirstName}} 我得到“FirstName is not defined”
  • 请查看我的更新@Eduard。您需要正确地实例化 Jobs - 而不仅仅是 Array。 :)
  • @Eduard 请查看工作中的 plunkr 示例。
  • 谢谢,它与private data: any = { ... } 合作,但我如何更改this.data,以便从服务器获取数据。因为当我加载页面时,该数据在控制台中。我不能这样做this.getJobs()。在这方面我感觉很糟糕,就像其他一切都相当容易。我只会将其标记为答案,因为即使我不擅长它也是正确的。
  • @Eduard 我会这样做:private data: any;,然后在构造函数中...this.data = (call to your server to get the data like you had before)。很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2017-11-08
相关资源
最近更新 更多