2016-02-29 4 views
2

У меня есть две даты/времени, которые исходят от db, однако они разделены на четыре (две даты и два раза) на представлении, и дата и время являются пользовательскими элементами. Смотри ниже.Aurelia validate one datetime больше, чем другой

enter image description here

Моя проблема моя дата/время начала не может быть больше, чем мой даты/времени. Я знаю, как это сделать в C#:

  • Проверьте, содержит ли строка даты значение по умолчанию 00:00:00, если так удалить.
  • парсинга строки даты/времени в новом DateTime
  • Повторите для второй даты/времени
  • Validate ли от < до (return from < to)

Но я не знаю, как сделать это в Aurelia без вызова API. Я отметил isLessThan, однако мне нужно было бы разобрать мои строки в datetime, прежде чем я смогу это сделать.

 bind(){ 
      return this.dataContext.getContent(this.id) 
       .then(baseContent => { 
        this.baseContent = baseContent; 
        this.validator = this.validation.on(this)           
    .ensure('baseContent.ValidFromDate').isNotEmpty() 
          .ensure('baseContent.ValidFromTime').isNotEmpty() 
          .ensure('baseContent.ValidToDate').isNotEmpty() 
          .ensure('baseContent.ValidToTime').isNotEmpty() 
.ensure('baseContent.ValidFromDate/baseContent.ValidFromTime').isLessThan('baseContent.ValidToDate/baseContent.ValidToTime') 
; 
       }); } 

Я знаю, что вышеизложенное не работает, я новичок в Aurelia и все еще нахожу свои ноги с ним.

UPDATE

Я попытался следующие, но получил:

Unhandled promise rejection TypeError: path.split is not a function

Я думаю, что этот вопрос он не знает, что назначить сообщение об ошибке, но я могу ошибаться ,

.ensure(this.datetimeformat.format(baseContent.ValidFromDate, baseContent.ValidFromTime)).isLessThan(this.datetimeformat.format(baseContent.ValidToDate, baseContent.ValidFromTime)); 

import moment from 'moment'; 

export class DateTimeFormat { 
    format(date, time) { 

     if (date.indexOf("T") > -1) { 
      date = date.split('T')[0]; 
     } 

     return moment(date + 'T' + time, 'DD/MM/YYYY HH:mm:ss'); 
    } 
} 

Я заметил один из ответов использовали computedFrom однако, как мне нужно сначала изменить их в DateTime, и разобрать назад я не знаю, что я имел в виду, чтобы обеспечить, где.

UPDATE

.ensure('baseContent.ValidFromDate', (config) => { config.computedFrom(['baseContent.ValidFromDate', 'baseContent.ValidFromTime', 'baseContent.ValidToDate', 'baseContent.ValidToTime']) }).isNotEmpty().passes(() => { 
         return this.datetimeformat.format(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime) < this.datetimeformat.format(this.baseContent.ValidToDate, this.baseContent.ValidToTime); 
        }) 

Я думаю, что я все ближе, но до сих пор не работает :-(

Я также попытался

.ensure('baseContent.ValidFromDate', (config) => { config.computedFrom(['baseContent.ValidFromDate', 'baseContent.ValidFromTime', 'baseContent.ValidToDate', 'baseContent.ValidToTime']) }).if(() => { 
         return this.baseContent.ValidFromDate !== null && this.baseContent.ValidFromTime !== null && this.baseContent.ValidToDate !== null && this.baseContent.ValidToTime !== null}) 
         .passes(() => {return this.datetimeformat.format(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime) < this.datetimeformat.format(this.baseContent.ValidToDate, this.baseContent.ValidToTime)}) 
        .endIf().isNotEmpty() 

нет ошибок с помощью инструментов разработчика.

function validateFromDateTimeIsBeforeToDateTime(dateFrom, timeFrom, dateTo, timeTo) { 
     debugger; 
     if (dateFrom !== null && dateFrom !== undefined && 
     timeFrom !== null && timeFrom !== undefined && 
     dateTo !== null && dateTo !== undefined && 
     timeTo !== null && timeTo !== undefined) { 

      return this.datetimeformat.format(dateFrom, timeFrom) < this.datetimeformat.format(dateTo, timeTo); 
    } 
    else { 
     return true; 
    } 
} 

        .ensure('baseContent.ValidFromDate').isNotEmpty().passes(validateFromDateTimeIsBeforeToDateTime(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime, this.baseContent.ValidFromDate, this.baseContent.ValidFromTime)) 
        .ensure('baseContent.ValidFromTime').isNotEmpty() 
        .ensure('baseContent.ValidToDate').isNotEmpty().passes(validateFromDateTimeIsBeforeToDateTime(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime, this.baseContent.ValidFromDate, this.baseContent.ValidFromTime)) 
        .ensure('baseContent.ValidToTime').isNotEmpty() 

Это, однако, бросает «Необработанное отказ обещания TypeError: Невозможно получить свойство„DateTimeFormat“неопределенной или нулевой ссылки»

ответ

0

После-много расследования, исправление ошибок здесь и там, я отметил выдающийся вопрос был из моего класса форматирования, он не корректно создавал дату/время (используя moment.js) (после того, как пользователь выбрал из календаря), что означает, что он вернул «недопустимую дату», которую вы не можете сравнивать: - |

Это будет работать:

this.validator = this.validation.on(this) 
        .ensure('baseContent.ValidFromDate', (config) => { config.computedFrom(['baseContent.ValidFromDate', 'baseContent.ValidFromTime', 'baseContent.ValidToDate', 'baseContent.ValidToTime']) }) 
         .if(() => { 
          return this.baseContent.ValidFromDate !== null && this.baseContent.ValidFromTime !== null && this.baseContent.ValidToDate !== null && this.baseContent.ValidToTime !== null }) 
          .passes(() => { return this.datetimeformat.format(this.baseContent.ValidFromDate, this.baseContent.ValidFromTime) < this.datetimeformat.format(this.baseContent.ValidToDate, this.baseContent.ValidToTime) }) 
          .withMessage('< Valid To') 
         .endIf() 
0

Я бы рекомендовал использовать вездесущий момент.JS библиотеки в этом случае:

jspm install moment

Затем использовать его, как это, например:

import moment from 'moment'; 

export class MyViewModel { 
    date1 = "2016-02-29"; 
    time1 = "09:00:00"; 
    date2 = "2016-03-01"; 
    time2 = "13:00:00"; 

    myMethod() { 
    let isValid = moment(`${this.date1 this.time1`).isBefore(moment(`${this.date2 this.time2`)); 
    alert(isValid); 
    } 
} 
+0

Если я создаю это в пределах родителя, как я называю это? т. е. this.validator = this.validation.on (this) .ensure (myMethod)? Извините, я довольно новичок в этом, его время от времени ложится вокруг меня. –

-1
.ensure('toDate', (config) => {config.computedFrom(['fromDate'])}) 
    .isGreaterThan(() => {return this.fromDate}, 'the entered Date'); 
+0

Как бы я согласовал дату и время? –

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