Angular2: Comment utiliser JavaScript Objet Date avec NgModel une liaison bidirectionnelle
Je travaille avec Angulaire 2 et j'ai ce code:
JS, ce code déclenche l'employé-variable pour le modèle:
handleEmployee(employee : Employee){
this.employee = employee;
this.employee.startDate = new Date('2005/01/01');
console.log(this.employee);
}
Modèle:
...
<div>
<label>Start date: </label>
<input [(ngModel)]="employee.startDate" type="date" name="startDate"/>
</div>
<div>
...
D'autres données comme prénom est affiché correctement. Mais pour la date je viens d'obtenir:
mm/dd/yyyy
Dans l'élément d'entrée, qui doit être une date.
Comment puis-je faire cela?
- Quand est
handleEmployee
appelé? Estemployee.startDate
initialisé lorsque le composant est créé (dans le constructeur ou avec la déclaration de la variable)?
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR:
quand j'ai écrit cette réponse DatePipe n'existait pas, maintenant, vous pouvez tout simplement faire ce
`
Vieille Réponse:
PLUNKER
Vous avez besoin de convertir
date object
dans leinput type="date"
format qui estyyyy-mm-dd
, c'est la façon dont il fonctionneraModèle:
Composant (TS):
TS
mais vous utilisezJS
. D'ailleurs, je viens de vous montrer comment faire pour lier undate object
avecNgModel
parce que je ne comprends pas comment vous l'utilisez. L'ajuster selon vos besoinsparseInt(e[1] -1 )
pour le mois, sinon il serait d'ajouter un mois à chaque fois j'ai choisi une date. Je suppose que c'est parce que le mois est zéro indexés dans le constructeur de Date.(new Date()).getTimezoneOffset() * 60000 ;
et ensuite l'utiliser offset pour imprimer la date :return (new Date(this.endDate.getTime() - tzOffset)).toISOString().slice(0,10);
.... Avec ça, je n'ai pas besoin d'ajouter 1 ti le jour lors de la configuration desetFulYear
dot
au lieu dedash
- la première division serait un échecLire pipes et ngModel
et ma décision:
FormControls (à la fois modèle axé sur la et réactif) abonnez-vous pour les valeurs et écrire des valeurs via des Directives qui mettent en œuvre des
ControlValueAccessor
. Jetez un oeil à la méthode selectValueAccessor, qui est utilisé dans toutes les directives nécessaires. Normal contrôles de saisie (par exemple,<input type="text">
) ou ces zones de texte sont traitées par le DefaultValueAccessor. Un autre exemple est la CheckboxValueAccessor qui est appliqué à la case de contrôles de saisie.Le travail n'est pas compliqué du tout. Nous avons juste besoin de mettre en œuvre une nouvelle valeur de l'accesseur pour la date de contrôles de saisie.
DateValueAccessor
est un joli nom:De nous attacher les
DateValueAccessor
pour le multi-fournisseurDATE_VALUE_ACCESSOR
, de sorte que selectValueAccessor pouvez le trouver.La seule question est, qui sélecteur doit être utilisé. J'ai décidé pour une solution opt-in.
Ici le DateValueAccessor sélectionne sur l'attribut "useValueAsDate".
Il est également possible de corriger le défaut de mise en œuvre.
Le sélecteur suivant activer la fonctionnalité comme par magie.
Mais s'il vous plaît être conscient que cela peut casser implémentations existantes qui utilisent de l'ancien comportement. Donc je pencherais pour l'opt-in version!
Que c'est tout le MNP et Github
Pour votre commodité, j'ai créé le projet
angulaires-données-valeur-accesseur
sur Github.Il y a aussi un MNP forfait disponible:
Alors il suffit d'importer le module via NgModule:
Vous pouvez maintenant appliquer le "useValueAsDate" votre date de contrôles de saisie.
Démo
Bien sûr, il y a une démo à:
http://johanneshoppe.github.io/angular-date-value-accessor/
ControlValueAccessor
J'ai commencé à essayer de mettre en œuvre Ankit Singh solution et a couru à quelques problèmes avec la validation et le fuseau horaire de trucs. (Même après avoir essayé les suggestions dans la section commentaire de cette réponse)
Au lieu de cela, j'ai choisi d'utiliser moment.js pour gérer la transformation entre la chaîne et la date en utilisant le format ISO8601 date de chaînes. J'ai eu d'excellents résultats dans le passé à l'aide de moment.js donc, ce n'était pas une décision difficile à prendre. Semble bien fonctionner pour moi, j'espère que quelqu'un d'autre trouve cela utile.
Pour mon Angulaire 2 app, j'ai couru npm install --enregistrer instant puis tourna Ankit de la solution dans un wrapper autour d'un js Date objet:
Puis pour le HTML:
Il fixe avec ce code:
Html: