ng-modèle ne fonctionne pas avec angulaire ui datepicker
Je veux utiliser ng-modèle à plus de respecter le format de date sur un champ de saisie à l'aide Angulaire UI datepicker. Le problème est quand je fais cela c'est montrant toujours invalide.
<p class="input-group">
<input type="text" datepicker-popup="MM/dd/yyyy" is-open="opened" close-text="Close"
ng-model="someDate" class="form-control" placeholder="mm/dd/yyyy"
ng-pattern="/^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/" required />
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="open($event)">
<i class="glyphicon glyphicon-calendar"></i>
</button>
</span>
</p>
Si j'applique le même ng-modèle à un simple champ de saisie (pas de datepicker), il fonctionne comme prévu.
Il semble y avoir un conflit, mais je ne suis pas sûr de ce qu'il est. Des idées?
Mise à jour:
Ici est un simple plunker pour illustrer la question comme l'a demandé. Après quelques creusement il ne semble pas être en cours d'exécution le modèle contre le sous-jacent Date
objet. Lorsque j'utilise un custom directive que le format de la date, cependant, il tourne contre le réel de l'entrée.
La seule documentation que je vois pour le gn-modèle est une brève mention ici en vertu de l'entrée. Est-il autre chose que peut-être que je suis absent?
Date
objet, non pas comme un String
.Utilisez-vous html2js dans votre processus de construction? Si vous le faites, quelle est sa version?
J'ai pensé à ça (la documentation n'est pas très claire) mais quand je le reproduire sur une autre entrée, soutenu par un objet Date, il fonctionne, de sorte qu'il semble être quelque chose avec le datepicker.
Je ne suis pas familier avec html2js... pour quoi faire?
J'ai regardé la plunker et j'ai aussi regardé le code pour datepicker-popup et je sais ce qui se passe.
datepicker
permet de s'assurer de la valeur de modèle est un Date
objet (aussi longtemps qu'il peut être analysé), mais ng-modèle fonctionne uniquement sur les cordes. Je pensais à la façon d'obtenir votre exigence pour le travail, mais plus important encore pourquoi avez-vous besoin que ng-pattern
de validation? datepicker
est déjà en l'obligeant à être une date valideOriginalL'auteur aw04 | 2014-05-20
Vous devez vous connecter pour publier un commentaire.
Comme je l'ai mentionné dans mon commentaire, ce qui se passe est que le
datepicker
directive est en train de changer le modèle de la valeur à partir d'unString
à unDate
objet. LorsquengPattern
essayé de valider lesDate
objet qu'il va échouer, car la chaîne de valeur d'unDate
ne va pas correspondre à la forme que vous utilisez.Ce que vous pouvez faire est de créer votre propre directive qui raccorde le $analyseurs de la ngModelController pour exécuter votre modèle de vérifier et d'appel
$setValidity()
basé sur ce qui a de la valeur.$parsers
est effectivement construit pour ce type de fonctionnalité où vous souhaitez exécuter vos propres validation sur unngModel
valeur.À la suite de ces balles est une directive qui permettra d'atteindre la fonctionnalité que vous souhaitez. Je tiens à expliquer la logique de la directive avant que je vous montre le code:
ngModel
dans votre définition de la directive, de sorte que vous pouvez accéder à langModelController
datepicker
les changements de la valeur de modèle à partir d'unString
à unDate
. Depuisdatepicker
utiliseunshift
à ajouter, c'est $analyseur de fonction pour le début de la$parsers
tableau, nous avons également besoin d'utiliserunshift
de mettre notre $parser avantdatepicker
's $parser.datepicker
directive prendre n'importe quelle valeur que l'on peut analyser en une date et à l'utilisation que pour le modèle. Afin de s'assurer que seules les dates qui correspondent à la forme sont utilisés, je suis de retourundefined
(comme indiqué dans les docs) pour les dates qui ne correspondent pas au modèle. Je ne vais pas faire cette vérification pour les valeurs qui viennent dans uneDate
objet puisque cela signifie qu'il a été choisi à l'aide de ladatepicker
widget.Date
objet puisque cela signifie qu'il a été choisi à l'aide de ladatepicker
widget qui signifie qu'il a une date de validité.directive code
html - assurez-vous que vous n'oubliez pas de supprimer le début et la barre oblique dans la regex définition:
Et voici une mise à jour de plunker avec mon code.
Alors pourquoi encore ne pas ng-travail de modèle?
Dans le cas où vous n'aviez pas remarqué la racine cause pour laquelle ng-modèle ne fonctionne pas lorsqu'il est utilisé avec le
datepicker
directive est parce que ledatepicker
directive ajoute sa propre ngModelController $parser à la début de l' $analyseurs de tableau à l'aide deunshift
, ce qui change la valeur de modèle à partir d'unString
à unDate
.Le même que aw04. Sans priorité, j'ai toujours la Date de réception de l'objet dans le unshift fonction, donc mon string parser n'a jamais été exécutée.
Juste remarqué un problème: si je entrer date non valide manuellement et après que j'choisir une date valide à partir de datepicker déroulante, puis la validation échoue encore. Évidemment, choisir une valeur valide ne réinitialise pas le modèle de l'état. Peut-être que cela a quelque chose à voir avec les changements de Rory G. de toute façon, j'ai ajouté une ligne
ngModelCtrl.$setValidity('datep',true)
au tout début deunshift
pour réinitialiser l'état de valable, et cela semble fonctionner correctement maintenant.si un cas de test sont écrits de la présente directive, s'il vous plaît partager.. il sera utile..
OriginalL'auteur JoseM
Il semble qu'une alternative à d'autres solutions de contournement posté ici est de mettre à niveau à AngularJS 1.4.5, publié 2015-08-28:
https://github.com/angular/angular.js/blob/master/CHANGELOG.md#145-permanent-internship-2015-08-28
OriginalL'auteur Alexandros Vellis
La directive ci-dessus plunker ne fonctionne que lorsque la date est nécessaire. Je l'ai corrigé en modifiant la directive comme suit:
Depuis le sélecteur de date court après cette directive, il définit des "date" retour à l'valide.
Très bien, merci. Comment vous est venu à l' 'datep de valeur? Est-il documenté nulle part ou avez-vous creuser quelque part en Date du Sélecteur de code source?
Il peut être n'importe quoi, par exemple 'datex" aussi longtemps qu'il n'est pas 'date'
OriginalL'auteur Rory G