2017-09-12 28 views
1

我正在开发一个angular应用程序和spring后端。我有一个FormGroup如下:Angular - 未定义为空字段转换

myForm = new FormGroup({ 
    fieldOne: new FormControl(), 
    fieldTwo: new FormControl(), 
    fieldThree: new FormControl() 
}); 

,像这样的对象匹配:

export class MyClass{ 
    firstField: number; 
    secondField: number; 
    thirdField: string; 
} 

当我提交表单我做这样的事:

this.firstField = myForm.value.fieldOne; 

的问题是,如果字段未设置,则它们是undefined。这对无法反序列化对象的后端服务造成问题,因为它不期望undefined但是null

这可以解决我的问题:

this.firstField = myForm.value.fieldOne ? myForm.value.fieldOne : null; 

,但是当我有很多领域它真的不是那么优雅。 然后我发现以下工作:

export class MyClass{ 
    firstField: number = null; 
    secondField: number = null; 
    thirdField: string = null; 
} 

这将是完美的。我的问题是,因为我是javascript的新手:那是对的吗?是否有另一种做这种转换的最佳做法?你通常如何解决前端和后端之间的这种序列化问题?谢谢。

回答

0

。而且你也可以定义默认值。就像如下

export class MyClass{ 
    firstField: number = 0; 
    secondField: number = 0; 
    thirdField: string = ''; 
} 

所以在这里你不需要处理undefinednull值。这是初始化这样的值的好习惯。

1

我没有看到您的方法有任何问题。它的默认行为是为未定义的表单值设置未定义的;根据定义:

未定义的属性表示变量未被赋值为 的值。

当您将null指定为默认值时,则由于JavaScript null为“无”。它应该是不存在的东西。因此,如果后端无法处理未定义的分配,则将所有成员变量分配为空。

希望这会有所帮助!

1

如果你想有一个清晰的解决方案,你可以让你的类内部的初始化函数,将所有的值初始化为null喜欢:作为@Manu指出您可以指定空值

export class MyClass{ 
    firstField: number; 
    secondField: number; 
    thirdField: string; 

    constructor() { 
     this.init(); 
    } 

    private init(): void { 
     Object.getOwnPropertyNames(this).forEach(
      (property) => { 
       this[property] = null; 
      } 
     ); 


} 
1

可以每个字段的值设置为空的,他们是不确定的情况下:

var obj = new MyClass(); 
obj.firstField = myForm.value.fieldOne; 
obj.secondField = myForm.value.fieldTwo; 
//... 
Object.keys(obj).forEach(field => obj[field] = obj[field] || null);