J'essaye d'utiliser KnockoutJS avec l'interface utilisateur jQuery. J'ai un élément d'entrée avec un datepicker attaché. Je suis actuellement en cours d'exécution knockout.debug.1.2.1.js
et il semble que l'événement de changement ne soit jamais capturé par Knockout. L'élément ressemble à ceci:
<input type="text" class="date" data-bind="value: RedemptionExpiration"/>
J'ai même essayé de changer le valueUpdate
type d'événement mais en vain. Il semble que Chrome provoque un focus
événement juste avant de modifier la valeur, mais pas IE.
Existe-t-il une méthode Knockout qui "relie toutes les liaisons"? Je n'ai techniquement besoin que de changer la valeur avant de la renvoyer au serveur. Je pourrais donc vivre avec ce genre de solution de contournement.
Je pense que le problème est la faute du datepicker, mais je ne peux pas comprendre comment résoudre ce problème.
Des idées?
Voici une version de la réponse de RP Niemeyer qui fonctionnera avec les scripts de validation knockout trouvés ici: http://github.com/ericmbarnard/Knockout-Validation
Les modifications sont apportées au gestionnaire d'événement de modification pour transmettre d'abord la valeur saisie et non la date aux scripts de validation, puis définir la date sur l'observable uniquement si elle est valide. J'ai également ajouté le validationCore.init qui est nécessaire pour les liaisons personnalisées décrites ici:
http://github.com/ericmbarnard/Knockout-Validation/issues/69
J'ai également ajouté la suggestion de rpenrose pour un flou sur le changement afin d'éliminer certains scénarios de datepicker embêtants qui gênaient les choses.
la source
J'ai utilisé une approche différente. Puisque knockout.js ne semble pas déclencher l'événement en cas de modification, j'ai forcé le sélecteur de date à appeler change () pour son entrée une fois fermé.
la source
Bien que toutes ces réponses m'aient épargné beaucoup de travail, aucune n'a fonctionné pleinement pour moi. Après avoir sélectionné une date, la valeur liée ne serait pas mise à jour. Je ne pouvais le mettre à jour que lors de la modification de la valeur de la date à l'aide du clavier, puis en cliquant hors de la zone de saisie. J'ai corrigé cela en augmentant le code de RP Niemeyer avec le code de syb pour obtenir:
Je soupçonne de mettre l'observable ($ (element) .datepicker ("getDate")); instruction dans sa propre fonction et l'enregistrer avec options.onSelect a fait l'affaire?
la source
onSelect
fonction, cela nechange
Merci pour cet article, je l'ai trouvé très utile.
Si vous voulez que le DatePicker se comporte exactement comme le comportement par défaut de JQuery UI, je vous recommande d'ajouter un flou sur l'élément dans le gestionnaire d'événements de modification:
c'est à dire
la source
J'ai résolu ce problème en modifiant l'ordre de mes fichiers de script inclus:
la source
Identique à RP Niemeyer, mais meilleure prise en charge de WCF DateTime, Timezones et Utilisation de la propriété DatePicker onSelect JQuery.
Prendre plaisir :)
http://jsfiddle.net/yechezkelbr/nUdYH/
la source
Je pense que cela peut être fait beaucoup plus facilement:
<input data-bind="value: myDate, datepicker: myDate, datepickerOptions: {}" />
Vous n'avez donc pas besoin de gestion manuelle des modifications dans la fonction init.
Mais dans ce cas, votre variable 'myDate' obtiendra uniquement une valeur visible, pas un objet Date.
la source
Vous pouvez également le spécifier dans la liaison:
Mettre à jour:
la source
Sur la base de la solution de Ryan, myDate renvoie la chaîne de date standard, ce qui n'est pas l'idéal dans mon cas. J'ai utilisé date.js pour analyser la valeur afin qu'elle renvoie toujours le format de date souhaité. Jetez un œil à cet exemple de violon Exemple .
la source
J'avais besoin de mettre à jour à plusieurs reprises mes données à partir du serveur, mais je n'ai pas tout à fait terminé le travail pour le partage de mes besoins ci-dessous (mon format de date / date (1224043200000) /):
Une fois le modèle correctement formaté pour la sortie, j'ai ajouté un modèle avec la documentation knockoutjs :
la source
Peu de gens ont demandé des options de sélecteur de date dynamiques. Dans mon cas, j'avais besoin d'une plage de dates dynamique - donc la première entrée définit la valeur minimale de la seconde et la seconde définit la valeur maximale pour la première. Je l'ai résolu en étendant le gestionnaire RP Niemeyer. Donc à son original:
J'ai ajouté deux autres gestionnaires correspondant aux options que je voulais modifier:
Et les ai utilisés comme ça dans mon modèle:
la source
L'utilisation de liaisons personnalisées fournies dans les réponses précédentes n'est pas toujours possible. Appel
$(element).datepicker(...)
prend un temps considérable, et si vous avez, par exemple, quelques dizaines, voire des centaines d'éléments pour appeler cette méthode, vous devez le faire "paresseux", c'est-à-dire à la demande.Par exemple, le modèle de vue peut être initialisé, le
input
s étant insérés dans le DOM, mais les sélecteurs de date correspondants ne seront initialisés que lorsqu'un utilisateur clique dessus.Alors, voici ma solution:
Ajoutez une liaison personnalisée qui permet d'attacher des données arbitraires à un nœud:
Utilisez la liaison pour attcah l'observable utilisée pour la
input
valeur de:Et enfin, lors de l'initialisation du datepicker, utilisez son
onSelect
option:De cette façon, chaque fois qu'un utilisateur change la date avec le sélecteur de date, l'observable Knockout correspondant est également mis à jour.
la source