【发布时间】:2017-12-12 02:28:59
【问题描述】:
我正在研究角度并尝试从子对象的键值中填充数据。 JSON数据在这里:
"other_lessons": [
{
"id": 290,
"name": "Christmas Test #290",
"course": {
"id": 43,
"name": "Christmas Test ",
"description": "",
"teacher": {
"id": 4,
"name": "Sandy's Teacher",
"email": "abc@s.com",
"role": "TEACHER",
"token": "abcd",
"about": "Blah blah blah ",
"phone": "2222222222",
"image_url": "xyz",
"payment_information": {}
}
]
我要做的是获取 course.name 和 course.id 数据的详细信息。而且我一直在我的开发人员控制台中收到此错误。
ERROR TypeError: Cannot read property 'name' of undefined
at Object.eval [as updateRenderer] (ng:///AppModule/AppTileComponent.ngfactory.js:30)
at Object.debugUpdateRenderer [as updateRenderer] (vendor.bundle.js:105951)
at checkAndUpdateView (vendor.bundle.js:105102)
at callViewAction (vendor.bundle.js:105445)
at execComponentViewsAction (vendor.bundle.js:105377)
at checkAndUpdateView (vendor.bundle.js:105103)
at callViewAction (vendor.bundle.js:105445)
at execComponentViewsAction (vendor.bundle.js:105377)
at checkAndUpdateView (vendor.bundle.js:105103)
at callViewAction (vendor.bundle.js:105445)
但是对于 JSON 数据中的 id 和 name 工作正常。我实现的代码是这样的,我将详细信息传递给选择器标记,即,
<widget-app-tile>
homepage.component.html
<widget-app-block title="You may be interested in">
<div class="row">
<div class="col-md-6" *ngFor="let lesson of lessons">
<widget-app-tile [lesson]="lesson"></widget-app-tile>
</div>
</div>
</widget-app-block>
app-tile.component.ts
import { Component, OnInit, Input } from '@angular/core';
import { Lesson } from '../../models/models';
@Component({
selector: 'widget-app-tile',
templateUrl: './app-tile.component.html',
styleUrls: ['./app-tile.component.css']
})
export class AppTileComponent implements OnInit {
@Input() lesson : Lesson = <Lesson> {}
constructor() { }
ngOnInit() {
}
}
app-tile.component.html
<div class="content-details">
<div class="details">
<h5>{{lesson.course.name}}</h5>
<img class="icon" src="/assets/images/logo-transparent.png" alt="No Internet" align="right"/>
</div>
如您所见,如果我调用 {{lesson.course.name}} 它会引发错误,但是当我调用它时 {{lesson.name}} 或 {{lesson.id}} 可以正常工作并显示数据。
我使用了Cerialize Library,我的模型类是这样的:
model.ts
import { deserialize, deserializeAs, Deserialize } from 'cerialize';
/* UTILTY METHODS */
export function cast(data, modelClass) {
return Deserialize(data, modelClass)
}
export function castCollection (collection, modelClass) {
return collection.map( item => cast(item, modelClass))
}
/* MODELS */
export class Course {
@deserialize id: number
@deserialize name: string
}
export class Lesson {
@deserialize id: number
@deserialize name: string
@deserializeAs(Course) course : Course
}
所以这是我用来获取数据的模型,而不是使用接口。
编辑
我已经尝试在我的主页本身上获取结果并且结果很好,但是在使用中但我不知道为什么 app-tile.component.ts 无法正常工作.我实现的 ocde 如下:
homepage.component.html
<div class="" *ngFor="let lesson of lessons" >
#{{lesson.id}} - {{lesson.name}}; Course: {{lesson.course.name}}
</div>
<widget-app-block title="You may be interested in">
<div class="row">
<div class="col-md-6" *ngFor="let lesson of lessons">
<widget-app-tile [lesson]="lesson"></widget-app-tile>
</div>
</div>
</widget-app-block>
在这里它工作正常。还有一个细节如下:
homepage.component.ts
export class MyClassesComponent implements OnInit {
lessons : Lesson[] = []
constructor(private http : HttpClient) { }
ngOnInit() {
}
ngAfterViewInit(){
this.http.get("/ui/student/home").subscribe( data => {
this.lessons = castCollection(data['other_lessons'], Lesson)
})
}
【问题讨论】:
-
这对你有用吗??
-
你能不能请你删除
现在试试它的工作与否 -
你能像我在回答中给出的那样请求 AppTileComponent 类吗
-
更新了答案,提供了一些提示,您可以在下次发现问题时使用
标签: json angular typescript