Les éléments de formulaire constituent le moyen classique d'interagir avec les utilisateurs via une page Web. Travailler avec des formulaires dans Knockout.js revient en gros à travailler avec des liaisons d’apparence. Mais, étant donné que les utilisateurs peuvent modifier les champs de formulaire, Knockout.js gère les mises à jour. dans les deux sens. Cela signifie que les liaisons interactives sont à double sens. Ils peuvent être définis par programme et la vue sera mise à jour en conséquence, ou ils peuvent être définis par la vue et lus par programme.
Figure 19: Knockout.js propageant les modifications dans les deux sensPar exemple, vous pouvez définir la valeur d'un champ de saisie de texte à partir du ViewModel et celui-ci sera affiché dans la vue. Cependant, l'utilisateur qui saisit quelque chose dans le champ de saisie met également à jour la propriété associée sur le ViewModel. Le fait est que Knockout.js s'assure toujours que la vue et le ViewModel sont synchronisés..
Knockout.js comprend 11 liaisons pour interagir avec l'utilisateur:
Cliquez sur
: valeur
: un événement
: soumettre
: activer
: désactiver
: vérifié
: options
:
élément avec un tableau ViewModel.options sélectionnées
:
champ.hasfocus
: Comme les liaisons d'apparence présentées dans la leçon précédente, elles sont toutes définies dans l'attribut data-bind d'un élément HTML. Certains d'entre eux (comme le Cliquez sur
contraignant) fonctionne sur n'importe quel élément, mais d'autres (comme coché) ne peuvent être utilisés qu'avec des éléments spécifiques.
L’un des principaux avantages de l’utilisation de Knockout.js pour gérer les formulaires HTML est que vous encore seulement avoir à se soucier des données. Chaque fois que l'utilisateur modifie la valeur d'un élément de formulaire, votre ViewModel reflète automatiquement la mise à jour. Cela facilite l'intégration de la saisie de l'utilisateur dans le reste de votre application..
Cette leçon utilise une nouvelle page HTML pour l'exemple en cours d'exécution. Au lieu d’une page d’affichage du panier, nous utiliserons un formulaire d’enregistrement pour les nouveaux clients. Créez un nouveau fichier HTML appelé interactive-bindings.html
et ajoutez ce qui suit:
Liaisons interactives
Ceci est une version simplifiée de ce que nous avons travaillé tout au long de la série. Dans cette leçon, nous ne nous préoccuperons que de configuration éléments de formulaire. Le traitement des soumissions de formulaire est laissé pour la prochaine leçon.
Cliquez sur
ContraignantLa liaison de clic est l'une des liaisons interactives les plus simples. Il appelle simplement une méthode de votre ViewModel lorsque l'utilisateur clique sur l'élément. Par exemple, ajoutez le bouton suivant à l’intérieur du élément:
Lorsque l'utilisateur clique sur le bouton, Knockout.js appelle le saveUserData ()
méthode sur PersonViewModel
. De plus, il transmet deux paramètres à la méthode de gestionnaire: le modèle actuel et l'événement DOM. Une méthode saveUserData () utilisant ces deux paramètres ressemblerait à ceci:
this.saveUserData = function (modèle, événement) alert (model.firstName () + "tente de passer à la caisse!"); if (event.ctrlKey) alert ("Il maintenait la touche Contrôle enfoncée pour une raison quelconque."); ;
Dans cet exemple particulier, modèle
fait référence à l'instance ViewModel de niveau supérieur, et un événement
est l'événement DOM déclenché par le clic de l'utilisateur. L'argument du modèle sera toujours le actuel ViewModel, qui permet d'accéder à des éléments de liste individuels dans une boucle foreach. Voici comment nous avons implémenté la méthode removeProduct () dans la leçon 3:.
valeur
ContraignantLa liaison de valeur est très similaire à la liaison de texte que nous avons utilisée tout au long de cette série. La principale différence est que cela peut être modifié par le utilisateur, et le ViewModel sera mis à jour en conséquence. Par exemple, nous pouvons relier le Prénom
et nom de famille
observables avec un champ de saisie en ajoutant le code HTML suivant au formulaire (avant la
Prénom:
Nom de famille:
le valeur: prénom
la liaison fait en sorte que le Le texte de l'élément est toujours identique à la propriété firstName de ViewModel, qu'il soit modifié par l'utilisateur ou par votre application. Il en va de même pour la propriété lastName.
Nous pouvons examiner cela davantage en incluant un bouton pour afficher le nom de l'utilisateur et un autre pour le définir par programme. Cela nous permet de voir comment le valeur
la reliure fonctionne des deux côtés:
Les méthodes de gestionnaire doivent ressembler à ceci:
this.displayName = function () alert (this.firstName ()); ; this.setName = function () this.firstName ("Bob"); ;
En cliquant Afficher un nom va lire le ViewModel Prénom
propriété, qui doit correspondre à la élément, même s'il a été modifié par l'utilisateur. le Nom du set bouton définit la valeur de la propriété de ViewModel, provoquant la élément à mettre à jour. Le comportement de ce dernier est essentiellement le même que celui d'un texte normal.
Une fois encore, l'objectif de cette synchronisation bidirectionnelle est de vous permettre de vous concentrer sur vos données. Après avoir configuré un valeur
contraignant, vous pouvez complètement oublier les éléments de formulaire HTML. Il suffit d’obtenir ou de définir la propriété associée sur le ViewModel et Knockout.js s’occupe du reste.
Nous n'aurons pas besoin de Afficher un nom
et les méthodes setName ou leurs boutons respectifs, afin que vous puissiez les supprimer et les supprimer si vous le souhaitez.
un événement
Contraignantle un événement
la liaison vous permet d'écouter des événements DOM arbitraires sur n'importe quel élément HTML. C'est comme une version générique du Cliquez sur
contraignant. Mais, comme il peut écouter plusieurs événements, un objet est nécessaire pour mapper les événements aux méthodes (ce paramètre est similaire au paramètre de la liaison attr). Par exemple, nous pouvons écouter les événements mouseover et mouseout du premier élément avec les éléments suivants:
Prénom:
Lorsque l'utilisateur déclenche un passer la souris
événement, Knockout.js appelle le afficher les détails()
méthode de notre ViewModel. De même, lorsqu'il quitte l'élément, hideDetails () est appelée. Ces deux paramètres prennent les mêmes paramètres que les gestionnaires de la liaison au clic: la cible de l'événement et l'objet événement lui-même. Implémentons maintenant ces méthodes:
this.showDetails = fonction (cible, événement) alert ("survolé"); ; this.hideDetails = function (cible, événement) alert ("Mouse out"); ;
Maintenant, quand vous interagissez avec le Prénom champ, vous devriez voir les deux messages pop-up. Mais au lieu d'afficher un message d'alerte, montrons des informations supplémentaires pour chaque champ de formulaire lorsque l'utilisateur le survole. Pour cela, nous avons besoin d’un autre observable sur PersonViewModel
:
this.details = ko.observable (false);
le détails
property agit comme une bascule que nous pouvons activer et désactiver à l'aide de nos méthodes de gestionnaire d'événements:
this.showDetails = fonction (cible, événement) this.details (true); ; this.hideDetails = function (cible, événement) this.details (false); ;
Ensuite, nous pouvons combiner la bascule avec le visible
contraignant pour afficher ou masquer les détails du champ de formulaire dans la vue:
Prénom: Votre prénom
Le contenu de la devrait apparaître chaque fois que vous passez la souris sur la Prénom champ et disparaissent lorsque vous passez la souris. Ceci est assez proche de la fonctionnalité souhaitée, mais les choses se compliquent lorsque nous voulons afficher les détails de plusieurs champs de formulaire. Comme nous n’avons qu’une seule variable, l’affichage des détails est une proposition tout ou rien: les détails sont affichés pour tout des champs, ou pour aucun d'entre eux.
Une façon de résoudre ce problème consiste à transmettre un paramètre personnalisé à la fonction de gestionnaire..
Il est possible de transmettre des paramètres personnalisés de la vue au gestionnaire d'événements. Cela signifie que vous pouvez accéder à des informations arbitraires de la vue dans le ViewModel. Dans notre cas, nous utiliserons un paramètre personnalisé pour identifier le champ de formulaire devant afficher ses détails. Au lieu d’une bascule, le détails
observable contiendra une chaîne représentant l'élément sélectionné. Premièrement, nous allons apporter quelques légères modifications dans le ViewModel:
this.details = ko.observable (""); this.showDetails = fonction (cible, événement, détails) this.details (détails); this.hideDetails = fonction (cible, événement) this.details ("");
Le seul gros changement ici est l’ajout d’un détails
paramètre à la afficher les détails()
méthode. Nous n'avons pas besoin d'un paramètre personnalisé pour la fonction hideDetails (), car elle efface simplement les détails observables.
Ensuite, nous allons utiliser un littéral de fonction dans le un événement
contraignant pour passer le paramètre personnalisé à showDetails ():
La fonction littérale pour passer la souris
est une enveloppe pour notre afficher les détails()
gestionnaire, fournissant un moyen simple de transmettre des informations supplémentaires. Le gestionnaire mouseout reste inchangé. Enfin, nous devons mettre à jour le contenant les détails:
Votre prénom
le Prénom Le champ de formulaire doit afficher sa description détaillée lorsque vous passez la souris et se masquer lorsque vous passez la souris, comme dans la section précédente. Seulement maintenant, il est possible d’ajouter des détails à plusieurs champs en modifiant le paramètre personnalisé. Par exemple, vous pouvez activer les détails pour le Nom de famille élément d'entrée avec:
Nom de famille: Votre nom
Les liaisons d'événement peuvent être un peu compliquées à configurer, mais une fois que vous comprenez leur fonctionnement, elles offrent des possibilités illimitées de conception réactive. le un événement
binding peut même se connecter à la fonctionnalité d'animation de jQuery, décrite dans la Leçon 8:. Pour l'instant, nous allons finir d'explorer le reste des liaisons interactives de Knockout.js. Heureusement pour nous, aucun d'entre eux n'est aussi compliqué que la liaison d'événement.
activer désactiver
Fixationsle activer
et désactiver
Les liaisons peuvent être utilisées pour activer ou désactiver les champs de formulaire en fonction de certaines conditions. Par exemple, supposons que vous vouliez enregistrer un numéro de téléphone principal et un numéro de téléphone secondaire pour chaque utilisateur. Ceux-ci peuvent être stockés en tant qu'observables normaux sur PersonViewModel:
this.primaryPhone = ko.observable (""); this.secondaryPhone = ko.observable ("");
L’observable primaryPhone peut être lié à un champ de formulaire avec un valeur
contraignant:
Téléphone primaire:
Toutefois, il n’est pas logique de saisir un numéro de téléphone secondaire sans spécifier un numéro principal. Nous activons donc le pour le numéro de téléphone secondaire uniquement si primaryPhone n'est pas vide:
Téléphone secondaire:
Désormais, les utilisateurs ne pourront interagir qu'avec le Téléphone secondaire champ s'ils ont entré une valeur pour Téléphone primaire
. le désactiver
la liaison est un moyen pratique d’annuler la condition, mais fonctionne autrement exactement comme enable.
vérifié
Contraignantvérifié
est une reliure polyvalente qui présente des comportements différents en fonction de la manière dont vous l’utilisez. En général, la liaison vérifiée est utilisée pour sélectionner et désélectionner les éléments de formulaire vérifiables de HTML: cases à cocher et boutons radio..
Commençons par une simple case à cocher:
Ennuyez-moi avec des offres spéciales:
Cela ajoute une case à cocher à notre formulaire et le lie au ennui
propriété du ViewModel. Comme toujours, il s’agit d’une connexion à double sens. Lorsque l'utilisateur sélectionne ou désélectionne la boîte, Knockout.js met à jour ViewModel et, lorsque vous définissez la valeur de la propriété ViewModel, il met à jour la vue. N'oubliez pas de définir la contrariété observable:
this.annoyMe = ko.observable (true);
En utilisant le vérifié
La liaison de cette manière revient à créer une relation univoque entre une case à cocher unique et un observable booléen..
Il est également possible d'utiliser le vérifié
liaison avec des tableaux. Lorsque vous liez une case à cocher à un tableau observable, les cases sélectionnées correspondent aux éléments contenus dans le tableau, comme illustré dans la figure suivante:
Par exemple, considérons l'observable suivant:
this.annoyTimes = ko.observableArray (['matin', 'soir']);
Nous pouvons connecter les éléments de ce tableau observable à des cases à cocher en utilisant le valeur
attribuer sur chaque élément:
Ennuyez-moi avec des offres spéciales:
Cela utilise le
Figure 24: Cases à cocher affichant l’état initial de laennui
propriété de la leçon précédente pour basculer vers une liste de cases à cocher permettant de sélectionner le moment opportun pour être ennuyé. Puisquevaleur = 'matin'
est sur la première case à cocher, il sera sélectionné chaque fois que le"Matin"
la chaîne est dans le tableau annoyTimes. La même chose vaut pour les autres cases à cocher. "morning" et "evening" sont les contenus initiaux du tableau. Vous devriez donc voir quelque chose comme ce qui suit sur votre page Web:ennuyer
tableau observableEt puisque nous utilisons un observable tableau, la connexion est bidirectionnelle-désélectionnant l'une des cases va supprimer la chaîne correspondante de la
ennuyer
tableau.Boutons radio
Le dernier contexte pour le
vérifié
la liaison est dans un groupe de boutons radio. Au lieu d’un booléen ou d’un tableau, des boutons radio connectent leursvaleur
attribut à une propriété de chaîne dans le ViewModel. Par exemple, nous pouvons transformer notre tableau de cases à cocher en un groupe de boutons d'option en modifiant tout d'abord la commande annoyTimes en chaîne:this.annoyTimes = ko.observable ('matin');Ensuite, tout ce que nous avons à faire est de tourner la
éléments en boutons radio:
Chaque
Figure 25: Connexion d'une chaîne observable avec plusieurs boutons radioavoir dû
"radio"
comme type et "annoyGroup" comme nom. Ce dernier n’a rien à voir avec Knockout.js, il les ajoute simplement au même groupe de boutons radio HTML. Maintenant, l'attribut value du bouton radio sélectionné sera toujours stocké dans la propriété annoyTimes.
le
options
Contraignantle
options
contraignant définit le contenu d'unélément. Cela peut prendre la forme d’une liste déroulante ou d’une liste à sélection multiple. D'abord, examinons les listes déroulantes. Modifions encore une fois la propriété annoyTimes:
this.annoyTimes = ko.observableArray (['Le matin', 'Le soir', 'Le soir']);Ensuite, nous pouvons le lier à un
terrain avec:
Vous devriez maintenant avoir une liste déroulante au lieu d'un groupe de boutons radio, mais il ne sert à rien d'avoir une telle liste si vous ne savez pas quel élément est sélectionné. Pour cela, nous pouvons réutiliser le
valeur
contraignant de plus tôt dans la leçon:Cela détermine quelle propriété sur le ViewModel contient la chaîne sélectionnée. Nous devons encore définir cette propriété:
this.selectedTime = ko.observable ('Dans l'après-midi');Encore une fois, cette relation va dans les deux sens. Définir la valeur de
heure sélectionnée
changera l'élément sélectionné dans la liste déroulante, et inversement.Utiliser des objets comme options
En combinant les options et les liaisons de valeur, vous obtenez tous les outils nécessaires pour utiliser des listes déroulantes contenant des chaînes. Cependant, il est souvent beaucoup plus pratique de sélectionner des objets JavaScript entiers à l'aide d'une liste déroulante. Par exemple, ce qui suit définit une liste de produits rappelant la leçon précédente:
this.products = ko.observableArray ([nom: 'Bière', prix: 10,99, nom: 'Brats', prix: 7,99, nom: 'Buns', prix: 2,99]);Lorsque vous essayez de créer un
Figure 26: Tentative d’utilisation d’objets avec leÉlément hors de celui-ci, tous vos objets seront rendus en tant que [objet Object]:
options
contraignantHeureusement, Knockout.js vous permet de passer une
optionsTexte
paramètre pour définir la propriété de l'objet à restituer dans lePour que cet extrait fonctionne, vous devez également définir un
produit préféré
observable sur votre ViewModel. Knockout.js va peupler cette propriété avec un objet de PersonViewModel.products - pas une chaîne comme dans la section précédente.
le
options sélectionnées
ContraignantL'autre possibilité de rendu pour HTML
L'élément est une liste à sélections multiples. Configurer une liste à sélections multiples est un peu comme créer une liste déroulante, sauf qu'au lieu de un élément sélectionné, vous avez un tableau des éléments sélectionnés. Donc, au lieu d’utiliser un
valeur
contraignant pour stocker la sélection, vous utilisez le contraignant selectedOptions:le
Taille
attribut définit le nombre d'options visibles, etmultiple = 'true'
le transforme en une liste à sélections multiples. Au lieu d’une propriété de chaîne, favoriteProducts devrait pointer sur un tableau:var brats = nom: 'Brats', prix: 7,99; this.products = ko.observableArray ([nom: 'Bière', prix: 10,99, marmots, nom: 'Buns', prix: 2,99]); this.favoriteProducts = ko.observableArray ([brats]);Notez que nous devions fournir la même référence d’objet (
marmots
) aux deuxdes produits
et favoriteProducts for Knockout.js pour initialiser correctement la sélection.
le
hasfocus
ContraignantEt ainsi, nous arrivons à notre dernière liaison interactive:
hasfocus
. Cette liaison bien nommée vous permet de définir manuellement le focus d'un élément interactif à l'aide d'une propriété ViewModel. Si, pour une raison quelconque, vous souhaitez que le champ «Téléphone principal» soit le focus initial, vous pouvez ajouter une liaison hasfocus, comme suit:Téléphone primaire:
Ensuite, vous pouvez ajouter un observable booléen pour dire à Knockout.js de le focaliser:
this.phoneHasFocus = ko.observable (true);En définissant cette propriété ailleurs dans votre application, vous pouvez contrôler avec précision le flux de focus dans vos formulaires. De plus, vous pouvez utiliser
hasfocus
pour suivre les progrès de l'utilisateur à travers plusieurs champs de formulaire.
Résumé
Cette leçon portait sur les liaisons interactives, qui exploitent le suivi automatique des dépendances de Knockout.js par rapport aux champs de formulaire HTML. Contrairement aux liaisons d’apparence, les liaisons interactives sont à double sens les liaisons-modifications des composants de l'interface utilisateur sont automatiquement reflétées dans le ViewModel et les assignations aux propriétés ViewModel déclenchent Knockout.js pour mettre à jour la vue en conséquence.
Les liaisons interactives, les liaisons d’apparence et les liaisons de flux de contrôle composent la boîte à outils de modèles de Knockout.js. Leur objectif commun est de fournir une interface centrée sur les données pour vos applications Web. Une fois que vous avez défini la présentation de vos données à l'aide de ces liaisons, tout ce dont vous avez à vous soucier est de manipuler le ViewModel sous-jacent. C'est un moyen beaucoup plus robuste de développer des applications Web dynamiques.
Cette leçon a présenté les formulaires du point de vue de la vue et du ViewModel. Les liaisons interactives sont une méthode intuitive et évolutive pour accéder aux entrées de l'utilisateur, mais nous n'avons pas encore expliqué comment extraire ces données du serveur frontal et dans un script côté serveur. La prochaine leçon aborde ce problème en intégrant Knockout.js à la fonctionnalité AJAX de jQuery..
Cette leçon représente un chapitre de Knockout Succinctly, un eBook gratuit de l'équipe de Syncfusion.