Javascript Ionic2-使用变量设置默认字段值不';行不通

Javascript Ionic2-使用变量设置默认字段值不';行不通,javascript,json,angular,ionic2,angular2-formbuilder,Javascript,Json,Angular,Ionic2,Angular2 Formbuilder,我的一个组件中有一个带有日期选择器的表单。此组件的构造函数如下所示 constructor(public navCtrl: NavController, private formBuilder: FormBuilder, private profileService: ProfileService) { this.formIsValid = true; let dobObj = JSON.parse(localStorage.getItem('current_profile

我的一个组件中有一个带有日期选择器的表单。此组件的构造函数如下所示

constructor(public navCtrl: NavController, private formBuilder: FormBuilder,
  private profileService: ProfileService) {
    this.formIsValid = true;

    let dobObj = JSON.parse(localStorage.getItem('current_profile')).stripeAccount.legal_entity.dob;
    let dob = (dobObj.year && dobObj.month && dobObj.day) ? dobObj.year + "-" + dobObj.month + "-" + dobObj.day : '';
    console.log(dob); // This prints "1999-12-31"

    this.dobForm = formBuilder.group({
      dob: [dob.toString(), Validators.required]
    });
  }
由于使用dob.toString()设置日期选择器的默认值,我收到以下错误消息

WARN: Error parsing date: "null". Please provide a valid ISO 8601 datetime format: https://www.w3.org/TR/NOTE-datetime
我控制台在formBuilder之前记录了该值,并按预期打印出日期。在formBuilder中设置默认值之前,字符串似乎发生了某种变化。如果我在formBuilder中硬编码字符串“1999-12-31”而不是使用变量,它会工作。我甚至检查以确保“dob==='1999-12-31'”是真的

为什么硬编码字符串可以设置默认值,而具有完全相同值的变量却不起作用

编辑:

这一定是日期选择器的错误。如果我输入“1999-12-31”作为硬编码字符串,它将按预期工作。如果我输入“1997-1-1”或“1997-12-3”,它将失败。它接受一些有效日期,而不是其他日期

编辑2:

看看这个:

constructor(public navCtrl: NavController, private formBuilder: FormBuilder,
              private profileService: ProfileService, private loadingService: LoadingService) {
    this.formIsValid = true;

    //TODO: What??? Why is this happening?
    console.log(new Date("1997-1-1")); // null
    console.log(new Date("1999-12-31")); // "1999-12-31T00:00:00.000Z"
    console.log(new Date("2010-11-7")); // null
    console.log(new Date("1992-4-21")); // null
    console.log(new Date("1842-2-27")); // null
    console.log(new Date("2000-8-20")); // null

    this.dobForm = formBuilder.group({
      dob: ['', Validators.required]
    });
  }

究竟为什么这么多字符串无法解析为日期?“1999-12-31”与其他版本有什么区别?

出现此问题的原因是您的日期选择器将
null
作为值。在datepicker的代码中,它们没有对
null
值进行验证

参考:源代码来自

导出函数updateDate(现有数据:DateTimeData,新数据:任意){ if(isPresent(newData)&&newData!=''){ if(isString(新数据)){ //新日期是一个字符串,希望是ISO格式 //如果是有效的ISO,请将其转换为我们的DateTimeData newData=parseDate(newData); 如果(新数据){ //已成功将ISO字符串解析为我们的DateTimeData 分配对象(现有数据、新数据); 返回; } }如果((isPresent(newData.year)| isPresent(newData.hour)| isPresent(newData.month)| isPresent(newData.day)| isPresent(newData.minute)| isPresent(newData.second))){ //newData来自日期时间选取器的选定值 //使用新值更新现有DateTimeData数据 //为12小时的数值做一些魔术 if(isPresent(newData.ampm)和&isPresent(newData.hour)){ 如果(newData.ampm.value=='pm'){ newData.hour.value=(newData.hour.value==12-12:newData.hour.value+12); }否则{ newData.hour.value=(newData.hour.value==12?0:newData.hour.value); } } //合并选择器选择的新值 //添加到现有的DateTimeData值 for(新数据中的var k){ (existingData)[k]=newData[k]。值; } 返回; } //eww,无效数据 console.warn(`Error parsing date:${newData})。请提供有效的ISO 8601日期时间格式:https://www.w3.org/TR/NOTE-datetime`); }否则{ //空白数据,清除所有内容 for(现有数据中的var k){ 删除(现有数据)[k]; } }
}

如果在一位数日期前添加“0”,则可以创建日期,如下所示:

console.log(new Date("2000-8-20"));  // null
console.log(new Date("2000-08-20")); // Sun Aug 20 2000 10:00:00 GMT+1000 (AEST)
要为日期选择器设置默认值,(正如@briosheje所指出的),这对我很有用:

this.fromDate = new Date().toISOString();

如果没有这一点,我将得到与问题中描述的相同的解析错误。

dob不是已经是字符串了吗?它没有在任何地方声明为日期对象。是的,它已经是字符串了。我包括了冗余强制转换,以防数据类型不同或其他情况。无论是否使用.toString()都不起作用。输入类型是日期或字符串(文本)?输入类型是IOS 8601日期时间格式的字符串。i、 e.“1999-12-31”或类似的东西。您是否尝试传递日期对象<代码>日期:[新日期(dob.toString()),验证器。必填]。或者,尝试:
dob:[newdate(dob.toString()).toISOString(),Validators.required]但是为什么日期为空?我用一些新的相关发现编辑了这个问题。你知道是什么导致日期为空吗?我在我的机器上尝试了所有的控制台语句(你提到的)。他们工作得很好。new Date()不应返回null。您是否弄乱了计算机的日期时间设置?这些控制台语句是否在“开发人员工具”的控制台上将日期显示为空?您是否弄乱了浏览器的日期时间或时区?我没有弄乱计算机的日期时间或时区设置,也没有弄乱浏览器的日期时间或时区设置。当我在开发人员控制台中记录这些日期时,它们工作正常。只有在我的Ionic2项目中,它们才记录为null。
this.fromDate = new Date().toISOString();