37

在我看来,我希望显示一个knockout.js包含日期的绑定字段。它只是一个显示字段而不是输入字段。像下面这样的东西basemodel.actionDate = ko.observable()

<p class="display-field" data-bind="text: baseModel.actionDate"/> 

但是,这显示如下:

2013-06-17T11:56:18.4537687Z

格式化这个最简单的方法是什么dd mm yyyy。例如:17 June 2013

4

5 回答 5

76

我推荐moment.js日期格式库。

使用它,您可以在视图中执行以下操作:

<p class="display-field" data-bind="text: moment(baseModel.actionDate()).format('LL')"/>
于 2013-06-17T13:49:21.440 回答
13

确保服务以正确的格式输出它,或者在客户端输出格式

如果您想在客户端执行此操作,则可以将 ISO 日期字符串解析为 Date 对象,然后使用 jQuery globalize 将其格式化为所需格式。

我为此使用 KO 扩展器

http://jsfiddle.net/vRf5B/42/

ko.extenders.date = function(target, format) {
    return ko.computed({
        read: function() {
            var value = target();
            if(typeof value === "string") {
                value = new Date(value);                
            }

            format = typeof format === "string" ? format: undefined;
            value = Globalize.format(value, format);

            return value;        
        },
        write: target
    });
}

更新

我在博客上遇到了一个问题,如何检索原始日期值可以通过在计算结果上公开原始值来完成

http://jsfiddle.net/vRf5B/91/

于 2013-06-17T13:48:02.613 回答
2

声明格式函数:

Date.prototype.toFormattedDate = function () {
  var dd = this.getDate();
  if (dd < 10) dd = '0' + dd;
  var mm = this.getMonth() + 1;
  if (mm < 10) mm = '0' + mm;
  var yyyy = this.getFullYear();
  /* change format here */
  return String(mm + "/" + dd + "/" + yyyy);
};

并将其与日期字符串一起使用:

<span data-bind="text: new Date(TaxAuthority.RegDate).toFormattedDate()"></span>
于 2018-02-26T10:30:38.620 回答
1

我在尝试使用扩展器时遇到了一些问题(我认为)。由于我只显示日期并且不允许编辑它们,我更喜欢只使用这样的绑定处理程序:

Shipped on <span data-bind="date: shipDt"></span>

这是处理程序:

    ko.bindingHandlers.date =
    {
        update: function (element, valueAccessor: () => any, allBindingsAccessor: any)
        {
            return ko.bindingHandlers.text.update(element, function ()
            {
                var value: any = ko.utils.unwrapObservable(valueAccessor());

                if (value == null)
                {
                    return null;
                }

                if (typeof value === "string")
                {
                    value = new Date(value);
                }

                return value.toShortDateString();

            }, allBindingsAccessor, null, null);
        }
    };

我选择像这样向 Date 对象添加一个原型(并调用toShortDateString在处理程序中创建的 Date 对象)-但是您可以将上面的逻辑替换为Globalize您喜欢的任何内容。

Date.prototype.toShortDateString = function ()
{
    return (this.getMonth() + 1) + "/" + this.getDate() + "/" + this.getFullYear();
};
于 2015-02-18T19:55:21.843 回答
0

如果您引用 moment.js,那么我实际上会在淘汰模型中格式化。

var BiographicViewModel = function (person) {
    this.FirstName = ko.observable(person.first_name);
    this.LastName = ko.observable(person.last_name);
    this.DOB = ko.observable(moment(person.birth_date).format("MM/DD/YYYY"));
    this.Gender = ko.observable(person.gender);
    this.Country = ko.observable(person.country);
    this.City = ko.observable(person.city);        
};
于 2017-09-08T21:43:09.130 回答