2017-09-12 43 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);