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();