【问题标题】:Angular 2: How to preserve class methods on deserialization?Angular 2:如何在反序列化时保留类方法?
【发布时间】:2017-08-17 08:52:36
【问题描述】:

假设我有一堂课Foo

export class Foo {
    name: string;

    printName(): void {
        console.log(this.name);
    } 
}

现在的问题是,当我的 FooService 从我的后端以 JSON 形式获取 Foo 并从中创建一个 Foo 对象时,它没有 printName() 因为在 JSON 对象中没有这样的东西。

我应该如何安排(在 Angular 2 的上下文中)?我是否必须在类之外创建我的方法,以便它们只接受 Foo 作为参数?

例如,在 Java 中,DTO 有方法是非常好的。

【问题讨论】:

  • 你的目标是什么?我没明白。你想在你的 Foo 对象上执行你的 printName() 方法,比如 this.foo.printName() 吗?
  • 例如,我可能有一些更复杂的方法可以从数据字段中计算某些内容。我想一个类有一些方法是完全正常的吗?这不是一个结构。
  • 所以,一些外部实体想要在从服务器获取 Foo 的方法后调用它们。
  • @YounesM 这实际上是相反的。从 JSON 中反序列化类会“删除”方法。

标签: json angular typescript


【解决方案1】:

通常您只通过 http 而不是类实例传输具有值的对象。您必须自己创建类实例

export class Foo {

    constructor(name: string) {}
    printName(): void {
        console.log(this.name);
    } 
}


// data deserialized by angular from the request
let data = { name: 'John' };

let foo: Foo = new Foo(data.name);

如果有帮助,您可以为从服务器接收的数据创建接口,并将其传递给 Foo 类的构造函数。

注意:请记住,TS 中没有类型转换。 如果你正在做类似的事情

let foo: Foo = <Foo> data;

这是一个类型断言,你只需告诉编译器 dataFoo 类型,它不会对 data 做任何事情对象。

【讨论】:

  • 是的,它将内容序列化/反序列化为对象,而不是类实例。您可能会混淆类型转换的类型断言。 :)
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2016-08-09
  • 2015-01-18
  • 2018-04-09
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多