Как конвертировать JSON DateTime в читаемую дату и время с помощью нокаута и пользовательских привязок

Я использую KnockoutJS с плагином отображения, и все работает хорошо, кроме поля DateTime, которое сериализуется как тики:/Date (x)/where x = ticks.

Как я: 1) Разбирайте объект даты в удобочитаемую форму? 2) Вернуть это из пользовательского привязки обратно в значение в модели?

Ответ 1

Я ничего не знаю о KnockoutJS, поэтому может быть лучший способ сделать это уже встроенным. Я также ничего не знаю о втором вопросе. Надеюсь, кто-то, кто действительно что-то знает об этом, может вам помочь.

Итак, с этим отказом от ответственности, вот как вы можете конвертировать его с помощью "простого" JavaScript (возможно, вам придется включить Douglas Crockford json2.js если вы хотите поддерживать "старые" браузеры). JSON.parse принимает необязательный аргумент reviver, который может заменить каждое значение при его анализе.

JSON.parse(jsonText, function(key, value) {
    // Check for the /Date(x)/ pattern
    var match = /\/Date\((-?\d+)\)\//.exec(value);
    if (match) {
        var date = new Date(+match[1]); // Convert the ticks to a Date object
        return humanReadable(date); // Format the date how you want it
    }

    // Not a date, so return the original value
    return value;
});

Ответ 2

Вот пример пользовательской привязки в knockoutjs. Он использует time.js для анализа даты

  ko.bindingHandlers.date = {
    update: function (element, valueAccessor) {
      var value = valueAccessor();
      var date = moment(value);
      $(element).text(date.format("L"));
    }
  };

В вашем javascript вы можете использовать новое связывание, как и любое другое связывание нокаутом.

  <td data-bind="date:Created" />

Ответ 3

Вот пример, если у вас есть функции в вашей viewmodel и привязка к вводу:

ko.bindingHandlers.date = {
        update: function (element, valueAccessor) {
            var value = valueAccessor();
            var date = moment(value());
            var strDate = date.format('YYYY-MM-DD');
            $(element).val(strDate);
        }
    };

Ссылка на moment.js