代码之家  ›  专栏  ›  技术社区  ›  Aerus

Angular 4 http响应没有函数

  •  0
  • Aerus  · 技术社区  · 7 年前

    我有一个带函数的类:

     export class Order {
        status: string;
    
        public isNew(): boolean {
            return status == 'NEW';
        }
     }
    

    创建新订单时,我可以调用函数:

    let order = new Order();
    order.isNew();
    

    但如果从后端检索订单并调用该方法,则会出现错误, order.isNew is not a function :

    this.http.get('url')
    .map(response => response.json() as Order)
    .subscribe(order => order.isNew());
    

    我做错了什么?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Sebastian    7 年前

    在您的示例代码中,没有逻辑可以让一些简单的JSON神奇地成为您的Order对象。你必须转换它。“as”运算符不这样做,这只是在TypeScript级别强制转换的类型。那里没有发生实际的转换。
    如果希望实现目标,请按顺序创建一个构造函数,该构造函数接受JSON并调用 .map(response => new Order(response.json()))

        2
  •  2
  •   Sebastian    7 年前

    你只是对订单做出回应,而不是创建订单的对象。这就是为什么你会犯这样的错误。

    像这样上课

    export class Order {
        status: string;
    
        constructor(obj?: any) {
             this.status = obj && obj.status || '';
        }
        public isNew(): boolean {
            return status == 'NEW';
        }
     }
    
    
    this.http.get('url')
    .map(response => response.json())
    .subscribe(order => {
        const new_order = new Order(order);
    });
    
        3
  •  1
  •   user4676340 user4676340    7 年前

    因为在数据库中,存储的是数据,而不是函数。这意味着您的函数未保存,因此当您收到响应时,它不在其中。

    此外,您只是对订单做出响应,而不是创建新的响应。这样做主要是为了在IDE中实现自动完成。

    如果你想让它工作,你需要创建一个构造函数:

    export class Order {
        constructor(public status?: string) { this.status = status; }
        public isNew(): boolean { return status == 'NEW'; }
    }}
    

    然后,您需要根据响应创建一个对象:

    this.http.get('url')
    .map(response => new Order(response.json().status))
    .subscribe(order => order.isNew());