【问题标题】:Angularjs 2 TypeError: Cannot read property 'infos' of undefined with the Http ClientAngularjs 2 TypeError:无法使用 Http 客户端读取未定义的属性“信息”
【发布时间】:2016-07-20 03:06:05
【问题描述】:

自从一个美好的一周以来,我一直在开发一个 angularjs 应用程序。我正在为我的服务构建一个后台应用程序。

我在使用从远程服务器获取的数据时遇到问题。我的应用中有 4 个 http GET 请求,其中 2 个正在获取用户和订单列表,那些工作正常,但另外 2 个,获取用户详细信息和订单详细信息给我同样的错误。

这是我收到的关于用户详细信息的错误:

Console error when trying to display user details

这里是组件(user-details.component.ts):

import {Component}          from 'angular2/core';
import {ROUTER_DIRECTIVES}  from 'angular2/router';
import {HTTP_PROVIDERS}     from 'angular2/http';

import {UserDetailsModel}   from '../model/user-details.model';
import {UserDetailsService} from '../service/user-details.service';
import {Configuration}      from '../app.constants';

@Component({
    selector: 'user-details',
    templateUrl: 'app/template/user-details.component.html',
    directives: [ROUTER_DIRECTIVES],
    providers: [UserDetailsService, HTTP_PROVIDERS, Configuration]
})

export class UserDetailsComponent {

    errorMessage: string;
    userDetailsModel: UserDetailsModel[];

    constructor (private _userDetailsService: UserDetailsService) { }

    ngOnInit() {
        this.getUserDetails();
    }

    getUserDetails() {
        this._userDetailsService.getUserDetails()
                          .subscribe(
                            userDetailsModel => this.userDetailsModel = userDetailsModel,
                            error => this.errorMessage = <any>error);
    }

}

这里是服务(user-details.service.ts):

import {Injectable}         from 'angular2/core';
import {Http, Response}     from 'angular2/http';
import {Observable}         from 'rxjs/Observable';

import {UserDetailsModel}  from '../model/user-details.model';
import {Configuration}      from '../app.constants';

@Injectable()
export class UserDetailsService {

    constructor (private _http: Http, private _config: Configuration) {

        this._actionUrl = _config.serverUrl + 'users/40';

    }
    private _actionUrl: string;


    getUserDetails () {
        return this._http.get(this._actionUrl)
                         .map(res => <UserDetailsModel[]> res.json().user)
                         .do(user => console.log(user))
                         .catch(this.handleError);
    }

    private handleError (error: Response) {
        // in a real world app, we may send the error to some remote logging infrastructure
        // instead of just logging it to the console
        console.error(error);
        return Observable.throw(error.json().error || 'Server error');
    }
}

这是模型(user-details.model.ts):

export class Address {
    constructor (
        public type:                string,
        public address:             string,
        public additional_info:     string,
        public zip_code:            string,
        public city:                string,
        public floor:               number,
        public elevator:            boolean
    ) { }
}

export class Infos {
    constructor (
        public username:    string,
        public email:       string,
        public first_name:  string,
        public last_name:   string,
        public birth_date:  string,
        public gender:      string,
        public telephone:   string
    ) { }
}

export class UserDetailsModel {
  constructor(
    public infos:    Infos[],
    public adresses: Address[]
  ) {  }
}

这是我使用从服务器获取数据的模板的一部分(user-details.template.ts):

<div class="row">
    <div class="col-lg-3">
        <img class="img-thumbail" src="http://placehold.it/150x150">
        <p>Rating xxxx</p>
    </div>
    <div class="col-lg-3">
        <p>Nom : {{userDetailsModel.infos[0].last_name}}</p>
        <p>Prénom : {{userDetailsModel.infos[0].first_name}}</p>
        <p>Date de naissance : {{userDetailsModel.infos[0].birth_date}}</p>
        <p>Adresse : {{userDetailsModel.adresses[0].address}}</p>
        <p>Code postal : {{userDetailsModel.adresses[0].zip_code}}</p>
        <p>Villee : {{userDetailsModel.adresses[0].city}}</p>
    </div>
    <div class="col-lg-3">
        <p>E-mail : {{userDetailsModel.infos[0].email}}</p>
        <p>Téléphone : {{userDetailsModel.infos[0].telephone}}</p>
        <p>Note moyenne </p>
        <p>Courtoisie</p>
        <p>Donne un coup de main</p>
    </div>
</div>

最后,这是我从 API 调用得到的 json 响应:

{
  "detail": "success"
  "user": {
    "infos": [1]
     0:  {
     "username": "john.doe@domain.com"
     "email": "john.doe@domain.com"
     "first_name": "Johan"
     "last_name": "Doe"
     "birth_date": "1994-07-09T05:00:00.000Z"
     "gender": "M"
     "telephone": "0612365478"
  }-
-
  "adresses": [1]
    0:  {
     "type": "Principal"
     "address": "2 place du chateau"
     "additional_info": null
     "zip_code": "35500"
     "city": "VITRE"
     "floor": null
     "elevator": null
    }-
  -
  }-
}

提前感谢您查看,希望您能帮助我找出我做错了什么。

编辑: 我在包装模板的主目录中添加了一个指令“*ngIf="userDetailsModel",现在它工作正常。事实上,模板正在运行并尝试在实际的 http 请求完成检索数据之前访问对象属性。

【问题讨论】:

  • 似乎Info & Address 在构造函数中有属性,应该在类本身中移出。
  • 什么意思?

标签: javascript angularjs json rest typescript


【解决方案1】:

看起来您将 userDetailsModel 定义为 UserDetails 数组:

userDetailsModel: UserDetailsModel[];

如果是这样,你需要在使用时指定一个索引。

userDetailsModel[x].propertyName

否则将其声明为 UserDetailsModel 的实例:

userDetailsModel: UserDetaislModel

【讨论】:

  • 是的,我是这样做的,我忘了把它改回一个对象而不是一个对象数组(这是我尝试别的东西的时候)
  • 好的,那么当您将其设为对象而不是数组时,这是否解决了问题?
  • 它有帮助,但真正解决它的方法是在模板的主
    中添加“*ngIf=userDetailsModel”。在完成对 API 的获取请求之前,模板尝试访问该对象。这就是解决我的问题的方法,我当然必须将其设为对象而不是数组。
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2017-12-26
  • 2021-11-21
  • 1970-01-01
  • 2019-05-16
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多