De mon point de vue, je souhaite afficher un champ lié knockout.js
contenant une date. C'est juste un champ d'affichage et non un champ de saisie. Quelque chose comme ci-dessous quand basemodel.actionDate = ko.observable()
<p class="display-field" data-bind="text: baseModel.actionDate"/>
Cependant, cela s’affiche comme suit:
2013-06-17T11:56:18.4537687Z
Quel est le moyen le plus simple de formater ce dd mm yyyy
. Exemple: 17 June 2013
?
Je recommande la bibliothèque de formatage moment.js date.
En l'utilisant, vous pouvez faire quelque chose comme ceci à votre avis:
<p class="display-field" data-bind="text: moment(baseModel.actionDate()).format('LL')"/>
Soit vous assurer que le service l’affiche dans un format correct, soit au format côté client.
Si vous souhaitez utiliser le côté client, vous pouvez analyser la chaîne de date ISO dans un objet Date, puis utiliser jQuery Globalize pour la formater au format souhaité.
J'utilise des rallonges KO pour cela
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
});
}
mettre à jour
J'ai une question sur mon blog sur la façon de récupérer la valeur de date brute. Il est possible d'exposer la valeur brute calculée de la manière suivante:
J'ai eu quelques problèmes (je pense) avec le plugin de mappage essayant d'utiliser l'extension. Comme je n’affiche que les dates et ne permet pas leur modification, je préfère utiliser un gestionnaire de liaisons comme celui-ci:
Shipped on <span data-bind="date: shipDt"></span>
Voici le gestionnaire:
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);
}
};
J'ai choisi d'ajouter un prototype à l'objet Date comme ceci (et d'appeler toShortDateString
sur l'objet Date créé dans le gestionnaire) - mais vous pouvez remplacer la logique ci-dessus par Globalize
ou ce que vous préférez.
Date.prototype.toShortDateString = function ()
{
return (this.getMonth() + 1) + "/" + this.getDate() + "/" + this.getFullYear();
};
Si vous faites référence à moment.js, alors je formaterais dans le modèle de masquage.
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);
};
Déclarez la fonction de formatage:
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);
};
Et utilisez-le avec les chaînes de date comme:
<span data-bind="text: new Date(TaxAuthority.RegDate).toFormattedDate()"></span>