【问题标题】:Can I somehow assign functions of an class to an object in Angular?我可以以某种方式将类的函数分配给 Angular 中的对象吗?
【发布时间】:2021-04-25 19:27:09
【问题描述】:

我有上课顺序

export class Order {
    constructor(public sName: string, public sSurname: string){}
   
    getFullName(){
       return this.sName + ' ' + this.sSurname;
    }
}

问题是当我将Order类型的对象存储在本地存储中然后尝试检索该对象时,刷新页面时丢失了Order类型的对象信息,这就是为什么我尽管信息相同,但无法调用函数getFullName()。实际上,该类要大得多,我不想在检索对象时使用new Order() 创建一个新实例。我写了一个函数adapt(order: any): Order,但在这种情况下,我希望数据库中的数据具有不同的属性名称(例如Name而不是sName。我可以为具有不同属性名称的对象编写一个函数adapt2(order): Order我试图避免。你会建议我做什么?

ngOnInit(){
    this.order = this.localstorage.retrieve('order') // order.getFullName() is not known
    // should I write a new adapt function or would you recommend me to do something else?
}

【问题讨论】:

  • 如何存储对象?显示一些代码
  • @RachidO 嘿,我使用 ngx-webstorage,所以我使用函数 store : this.localstorage.store('order', order)。我知道刷新时信息会丢失(已经问过这个问题):我想知道如何告诉应用程序我要检索的对象是Order 类型。我可以使用new Order(order.sName ...),但实际上对象太大了,我不想使用它。这就是我要求其他方法的原因。
  • 这是预期的。没有选项可以在任何 js 存储中存储“类实例”。如果你真的需要它,你必须自己实现序列化和反序列化逻辑

标签: angular typescript class local-storage


【解决方案1】:

这是预期的行为,因为在 JavaScript 中没有标准的序列化/反序列化类的方法。要解决这个问题,您可以使用typeson 包来正确序列化该类。或者你可以做一些简单的事情:

const order = this.localStorage.retreive('order');
Object.setPrototypeOf(order, Order.prototype);

但请记住,如果您的类有任何属性也是类,则需要递归地对它们执行相同的操作。这就是为什么有时使用像typeson这样的包会更容易

【讨论】:

  • Object.setPrototypeOf 正是我所需要的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
相关资源
最近更新 更多