Ionic2 - установка значения поля по умолчанию с помощью переменной не работает

У меня есть форма в одном из моих компонентов с выбором даты. Конструктор этого компонента выглядит так.

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. Если я жестко запрограммирую строку «1999-12-31» в formBuilder вместо использования переменной, это сработает. Я даже проверил, что "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" от остальных?


person EmacsVI    schedule 24.01.2017    source источник
comment
Разве dob уже не строка? он нигде не объявлен как объект Date буквально.   -  person briosheje    schedule 24.01.2017
comment
да это уже строка. Я включил избыточное приведение на тот случай, если тип данных был другим или что-то в этом роде. Он не работает с .toString() или без него.   -  person EmacsVI    schedule 24.01.2017
comment
ваш тип ввода дата или строка (текст)?   -  person briosheje    schedule 24.01.2017
comment
Тип ввода — строка в формате даты и времени IOS 8601. то есть 1999-12-31 или что-то подобное.   -  person EmacsVI    schedule 24.01.2017
comment
вы пытались вместо этого передать объект даты? dob: [new Date(dob.toString()), Validators.required]. В качестве альтернативы попробуйте: dob: [new Date(dob.toString()).toISOString(), Validators.required];   -  person briosheje    schedule 24.01.2017
comment
У меня есть. Это тоже не сработало. Получите это, хотя: просто консоль регистрирует новую дату (1997-1-1) пустую, тогда как новая дата (1999-12-31) является датой. Это почему? Это не имеет ничего общего с моим проектом; это похоже на проблему с javascript?   -  person EmacsVI    schedule 24.01.2017
comment
Правильно работает здесь: jsfiddle.net/09jhL8yq . Это должно быть что-то связанное с форматом, который приобретает сам плагин, возможно, он просто принимает даты, совместимые с ISO 8601, а 1997-1-1 не соответствует ISO 8601, насколько я знаю, поэтому я бы предпочел задаться вопросом, почему второй случай (с toISOString) тоже не работает. Однако это не должно быть связано с javascript, несмотря на то, что я обычно избегаю использования прототипа даты и вместо этого использую некоторые сторонние библиотеки, такие как Momentjs.   -  person briosheje    schedule 24.01.2017


Ответы (2)


Причина этой проблемы в том, что ваше средство выбора даты принимает null в качестве значения. В коде средства выбора даты у них нет проверки для значения null.

См. исходный код из http://Ionic%20Datepicker

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

}

person Yuvraj Patil    schedule 24.01.2017
comment
Но почему дата нулевая? Я отредактировал вопрос с некоторыми новыми, соответствующими выводами. Любые идеи о том, что происходит, чтобы сделать даты нулевыми? - person EmacsVI; 25.01.2017
comment
Я попробовал все операторы консоли (упомянутые вами) на своей машине. они работают нормально. новая дата() не должна возвращать значение null. Вы перепутали настройки даты и времени на вашем компьютере? - person Yuvraj Patil; 25.01.2017
comment
Эти операторы консоли отображают даты как нулевые на консоли инструмента разработчика? - person Yuvraj Patil; 25.01.2017
comment
Вы перепутали дату и время или часовой пояс вашего браузера? - person Yuvraj Patil; 25.01.2017
comment
Я не заморачивался ни с настройками даты и времени, ни с настройками часового пояса, ни с настройками моего браузера. Когда я регистрирую эти даты в консоли разработчика, они работают нормально. Только в моем проекте Ionic2 они регистрируются как нулевые. - person EmacsVI; 28.01.2017

Если вы добавите «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();

Без этого я получал ту же ошибку синтаксического анализа, что и в вопросе.

person curchod    schedule 19.04.2017