繁体   English   中英

儿童模型吸气剂和二传手不能以角度2/4工作

[英]Child model getter and setter are not working in angular 2/4

我有一种情况,我已经定义了三个模型类,如下所示

export class Parent 
{
    name: string;
    containers: Container[];  
}

export class Container
{
    desc: string;
    sets: Sets[];  
}


export class Sets
{
    private _data?: any[];
    private _dataSet?: any[];

    get data() 
    {
        if (this.dataSet && this.dataSet.length > 0) 
        {
            return this._dataSet[0].data;
        }
        return this._data;
    }

    set data(data: any[]) 
    {
        this._data = data;
    }

    get dataSet() 
    {
        return this._dataSet;
    }

    set dataSet(dataSet: any[]) 
    {
        this._dataSet = dataSet;
    }
}

问题是:除非我明确地执行new Set()否则不会触发Set类的gettersetter方法(我不知道new Set()是否真的有必要)。

例如:

"name": "vik",
"containers": [
{
    "desc": "something",
    "sets": [
    {
        "dataSet": [
        {
            "data":[
            {
                // Object
            }]
        }]
    }]
}]

当我做:

let response:Parent = responseObj;
console.log(response.containers[0].sets[0].data)

它应该返回DataSet value ,而是返回undefined

但如果我这样做:

let response:Parent = responseObj;
console.log(new Sets(response.containers[0].sets[0]).data)

返回正确的值。

我错过了什么或者我如何改进我的代码以便它有效?

问题是你的对象来自HTTP。 这是什么意思:

Http是一种基于文本的格式。 这意味着当响应发生时,它是一个唯一的字符串,如:

"{"foo":"boor"}"

然后你像JSON.parse(数据)一样smth并返回真实对象,如:

{foo: "bar"};

但是JSON.parse对你预期的类型没有任何意义。 它不知道如何从对象的字符串实例。 它可以尝试制作一个简单的对象,这就是全部。

你看,你的数据对象没有关于它的类型,方法,getter / setter等的信息。它只是关于平面数据aka dto。 所以,如果你想从你的dto获得真正的类,你应该编写更聪明的解析器,这将带你的dto并从它创建预期类的真实实例。 基本上你已经这样做了

new Sets(response.containers[0].sets[0])

所以你可以继续这样做,但是你会发现这个重复的代码都在你的应用程序周围。 我找到的最好方法是将mapper注入数据服务器并返回不是dto而是返回实例。 因此,您的其他代码对此“脏”工作一无所知,并且始终适用于“普通”对象。

希望这可以帮助。

UPD:

 let rawData = '{"name":"Vitalii"}'; let person1 = JSON.parse(rawData); function Person(data) { this.name = data.name; this.say = function() { console.log(`Hi, ${this.name}`); } } let person2 = new Person(person1); person2.say(); // person1 and person2 have the same data inside. But: console.log(person2 instanceof Person); // true console.log(person1 instanceof Person); // false 

这是因为即使它们看起来相似,该对象也具有不同的性质。

是的,您必须(以某种方式)将您的普通对象解析为您定义的类实例,其他人已经为您解答了它。

所以我只建议一种重构方法: 类变换器的嵌套对象

import { Type, plainToClass } from 'class-transformer';

export class Parent {
    @Type(() => Container)
    name: string;
    containers: Container[] = [];  
    static fromJson(json: any): Parent {
      return plainToClass<any, Parent>(Parent, json);
    }
}

export class Container{
    @Type(() => Set)
    desc: string;
    sets: Set[] = [];
}

export class Set{
    private _data?: any[];
    private _dataSet?: any[];

    //your code
}

然后

let response:Parent = responseObj;
console.log(Parent.fromJson(response).containers[0].sets[0].data)

我觉得这个更整洁

希望这个帮助〜

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM