Ionic2 - 使用变量设置默认字段值不起作用

时间:2017-01-24 08:49:01

标签: javascript json angular ionic2 angular2-formbuilder

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

input{
    # something here to get a value of variable stored in a different file
    elasticsearch{
    hosts=>"abc.de.fg.hi:jklm"
    query=>'{--some query---}'
    }
    }
    output{

    elasticsearch{
    hosts=>"xxx.xx.xx.xx:yyyy"

    }

由于我用来设置日期选择器的默认值的dob.toString(),我收到以下错误消息。

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]
    });
  }

我控制台在formBuilder之前记录了值,并按预期打印出日期。在用于在formBuilder中设置默认值之前,似乎字符串以某种方式被更改。如果我硬编码字符串" 1999-12-31"在formBuilder而不是使用变量,它的工作原理。我甚至检查确保" dob ===' 1999-12-31'"是真的。

为什么硬编码字符串在设置默认值时起作用,但具有完全相同值的变量不起作用?

编辑:

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

编辑2:

检查出来:

WARN: Error parsing date: "null". Please provide a valid ISO 8601 datetime format: https://www.w3.org/TR/NOTE-datetime

为什么在地球上这么多字符串无法解析为日期? " 1999-12-31"之间的区别是什么?和其他人?

2 个答案:

答案 0 :(得分:0)

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

参考:https://github.com/driftyco/ionic/blob/master/src/util/datetime-util.ts

的源代码
export function updateDate(existingData: DateTimeData, newData: any) {
  if (isPresent(newData) && newData !== '') {

    if (isString(newData)) {
      // new date is a string, and hopefully in the ISO format
      // convert it to our DateTimeData if a valid ISO
      newData = parseDate(newData);
      if (newData) {
        // successfully parsed the ISO string to our DateTimeData
        Object.assign(existingData, newData);
        return;
      }

    } else if ((isPresent(newData.year) || isPresent(newData.hour) || isPresent(newData.month) || isPresent(newData.day) || isPresent(newData.minute) || isPresent(newData.second))) {
      // newData is from of a datetime picker's selected values
      // update the existing DateTimeData data with the new values

      // do some magic for 12-hour values
      if (isPresent(newData.ampm) && isPresent(newData.hour)) {
        if (newData.ampm.value === 'pm') {
          newData.hour.value = (newData.hour.value === 12 ? 12 : newData.hour.value + 12);

        } else {
          newData.hour.value = (newData.hour.value === 12 ? 0 : newData.hour.value);
        }
      }

      // merge new values from the picker's selection
      // to the existing DateTimeData values
      for (var k in newData) {
        (<any>existingData)[k] = newData[k].value;
      }

      return;
    }

    // eww, invalid data
    console.warn(`Error parsing date: "${newData}". Please provide a valid ISO 8601 datetime format: https://www.w3.org/TR/NOTE-datetime`);

  } else {
    // blank data, clear everything out
    for (var k in existingData) {
      delete (<any>existingData)[k];
    }
  }

}

答案 1 :(得分:0)

如果在单个数字日期前添加“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();

没有它,我得到了与问题中描述的相同的解析错误。