2017-02-06 2 views
0

я использую momentjs работать с датами в моем проекте, когда пользователь вводит дату в формате M/D/YYYY вернуться к MM/DD/YYYY формату (например, 2/5/2017 к 02/05/2017). Я также конвертирую любые недействительные даты или даты, которые больше, чем сегодня, для возврата к сегодняшней дате.Удаление предупреждения устаревания из momentjs

element.on("blur", function() { 
    var currentDate = moment().format('MM/DD/YYYY'); 
    var formattedInput; 

    if (ctrl.$modelValue !== undefined && ctrl.$modelValue !== "") { 

     if(moment(ctrl.$modelValue, "MM/DD/YYYY", true).isValid()) { 
      formattedInput = moment(ctrl.$modelValue); 
      formattedInput.format('MM/DD/YYYY'); 
      if (formattedInput.isAfter(currentDate)) { 
       ctrl.$setViewValue(currentDate); 
       ctrl.$render(); 
      } 
     } else if (moment(ctrl.$modelValue, "M/D/YYYY", true).isValid()) { 
      formattedInput = moment(ctrl.$modelValue); 
      formattedInput.format('MM/DD/YYYY'); 
      if (formattedInput.isAfter(currentDate)) { 
       ctrl.$setViewValue(currentDate); 
       ctrl.$render(); 
      } else { 
       ctrl.$setViewValue(formattedInput.format('MM/DD/YYYY')); 
       ctrl.$render(); 
      } 
     } else { 
      ctrl.$setViewValue(currentDate); 
      ctrl.$render(); 
     } 
    } 
}); 

Насколько я могу судить, все это прекрасно работает с кодом, который у меня выше. Но независимо от работоспособности, я получаю предупреждение об устаревании для не-ISO-дат. Мои мысли - использование формата MM/DD/YYYY, однако это невозможно заменить из-за требований бизнеса. Есть ли способ устранить эту проблему не громоздким способом?

ответ

1

Проблема с formattedInput = moment(ctrl.$modelValue) здесь вы используете разбор симуляции без формата с датами, отличными от ISO. Чтобы удалить Предупреждение об изъятии, просто используйте moment(ctrl.$modelValue, "MM/DD/YYYY") и moment(ctrl.$modelValue, "M/D/YYYY"), как вы это делали в состоянии if.

Ваш полный код будет следующим:

element.on("blur", function() { 
    var currentDate = moment(); 
    var formattedInput; 

    if (ctrl.$modelValue !== undefined && ctrl.$modelValue !== "") { 

    if(moment(ctrl.$modelValue, "MM/DD/YYYY", true).isValid()) { 
     formattedInput = moment(ctrl.$modelValue, "MM/DD/YYYY", true); 
     // This line returns a string, but does not assign to value, so it's superfluous 
     //formattedInput.format('MM/DD/YYYY'); 
     if (formattedInput.isAfter(currentDate)) { 
     ctrl.$setViewValue(currentDate.format('MM/DD/YYYY')); 
     ctrl.$render(); 
     } 
    } else if (moment(ctrl.$modelValue, "M/D/YYYY", true).isValid()) { 
     formattedInput = moment(ctrl.$modelValue, "M/D/YYYY", true); 
     // see previous comment 
     //formattedInput.format('MM/DD/YYYY'); 
     if (formattedInput.isAfter(currentDate)) { 
     ctrl.$setViewValue(currentDate.format('MM/DD/YYYY')); 
     ctrl.$render(); 
     } else { 
     ctrl.$setViewValue(formattedInput.format('MM/DD/YYYY')); 
     ctrl.$render(); 
     } 
    } else { 
     ctrl.$setViewValue(currentDate.format('MM/DD/YYYY')); 
     ctrl.$render(); 
    } 
    } 
}); 

Обязательно полностью понять разницу между moment parsing (построить объект момент из строки) и момент format (показывать строковое представление объекта момента) ,

+1

Вау, я не заметил, что .format() не возвращал мгновенный объект. Это в конечном итоге стало основной причиной проблемы, так как моя переменная 'today' сравнивалась с объектами строки и момента в моих вызовах' .isAfter(). С тех пор я изменил код для работы, изменив «var currentDate = moment()» и используя функции '.format()' при настройке значения представления. Огромное спасибо! – bang

+0

Добро пожаловать! Я не заметил, что сегодня var рассматривается как строка, даже если вы уже решили свою проблему, я исправил свой пример кода после вашего комментария. – VincenzoC

Смежные вопросы