Comme nous l'avons vu dans les leçons précédentes, concevoir une vue pour un ViewModel revient à créer un modèle HTML pour un objet JavaScript. La possibilité de contrôler le déroulement de l’exécution des modèles fait partie intégrante de tout système de modèles. La possibilité de parcourir des listes de données et d'inclure ou d'exclure des éléments visuels en fonction de certaines conditions permet de minimiser le balisage et vous permet de contrôler totalement l'affichage de vos données..
Nous avons déjà vu comment le pour chaque
La liaison peut se faire en boucle sur un tableau observable, mais Knockout.js inclut également deux liaisons logiques: si
et sinon. En outre, sa liaison avec vous permet de modifier manuellement la portée des blocs de modèle.
Cette leçon présente les liaisons de contrôle de Knockout.js en développant l'exemple de panier d'achat de la leçon précédente. Nous allons également explorer certaines des nuances de pour chaque
qui ont été passés sous silence dans la dernière leçon.
pour chaque
ContraignantCommençons par regarder de plus près notre existant pour chaque
boucle:
Quand Knockout.js se rencontre pour chaque
dans le liaison de données
attribut, il parcourt le tableau shoppingCart et utilise chaque élément trouvé pour le contexte contraignant du balisage contenu. C'est dans ce contexte de liaison que Knockout.js gère l'étendue des boucles. Dans ce cas, c’est pourquoi nous pouvons utiliser les propriétés name et price sans faire référence à une instance de Product..
L'utilisation de chaque élément d'un tableau en tant que nouveau contexte de liaison constitue un moyen pratique de créer des boucles, mais ce comportement rend également impossible la référence à des objets extérieurs à l'élément actuel de l'itération. Pour cette raison, Knockout.js rend plusieurs propriétés spéciales disponibles dans chaque contexte de liaison. Notez que toutes ces propriétés ne sont disponibles que dans la vue, pas le ViewModel.
$ root
Propriétéle $ root
le contexte fait toujours référence au ViewModel de niveau supérieur, quelles que soient les boucles ou autres modifications de l'étendue. Comme nous l'avons vu dans la leçon précédente, cela permet d'accéder aux méthodes de niveau supérieur permettant de manipuler le ViewModel..
$ data
Propriétéle $ data
La propriété dans un contexte de liaison fait référence à l'objet ViewModel pour le contexte actuel. C'est un peu comme le ce
mot clé dans un objet JavaScript. Par exemple, dans notre boucle foreach: shoppingCart, $ data fait référence à l'élément de la liste en cours. En conséquence, le code suivant fonctionne exactement comme il le ferait sans utiliser $ data:
Cela peut sembler une propriété triviale, mais il est indispensable lorsque vous effectuez une itération dans des tableaux contenant des valeurs atomiques telles que des chaînes ou des nombres. Par exemple, nous pouvons stocker une liste de chaînes représentant des balises pour chaque produit:
fonction Produit (nom, prix, tags) this.name = ko.observable (name); this.price = ko.observable (prix); tags = typeof (tags)! == 'undefined'? Mots clés : []; this.tags = ko.observableArray (tags);
Ensuite, définissez des tags pour l’un des produits de la chariot
tableau:
nouveau produit ("Buns", 1.49, ["Produits de boulangerie", "Hot dogs"]);
Nous pouvons maintenant voir le contexte $ data en action. dans le
élément contenant un
Mots clés tableau: |
À l'intérieur de la foreach: balises
Pour ce faire, Knockout.js utilise les chaînes natives «Baked goods» et «Hot dogs» comme contexte contraignant. Mais, puisque nous voulons accéder aux chaînes réelles au lieu de leurs Propriétés, nous avons besoin de l'objet de données $.
$ index
PropriétéÀ l'intérieur d'un pour chaque
boucle, la $ index
propriété contient l'index de l'élément en cours dans le tableau. Comme la plupart des choses dans Knockout.js, la valeur de $ index sera mise à jour automatiquement chaque fois que vous ajoutez ou supprimez un élément du tableau observable associé. C'est une propriété utile si vous devez afficher l'index de chaque élément, comme ceci:
$ parent
Propriétéle $ parent
propriété fait référence à l'objet ViewModel parent. En règle générale, vous en aurez besoin uniquement lorsque vous utilisez des boucles imbriquées et que vous devez accéder aux propriétés de la boucle externe. Par exemple, si vous devez accéder à la Produit
exemple de l'intérieur de la boucle foreach: tags, vous pouvez utiliser la propriété $ parent:
Entre les tableaux observables, le pour chaque
la liaison et les propriétés de contexte de liaison évoquées précédemment, vous devez disposer de tous les outils nécessaires pour exploiter les tableaux dans vos applications Web Knockout.js.
Avant de passer aux liaisons conditionnelles, nous allons ajouter un remise
propriété de notre classe de produits:
fonction Produit (nom, prix, tags, remise) … remise = typeof (remise)! == 'undefined'? remise: 0; this.discount = ko.observable (réduction); this.formattedDiscount = ko.computed (function () return (this.discount () * 100) + "%";, ceci);
Cela nous donne une condition que nous pouvons vérifier avec les liaisons logiques de Knockout.js. Tout d'abord, nous faisons le remise
paramètre optional, lui donnant une valeur par défaut de 0. Ensuite, nous créons un observable pour la remise afin que Knockout.js puisse suivre ses modifications. Enfin, nous définissons une observable calculée qui renvoie une version conviviale du pourcentage de remise..
Continuons et ajoutons une réduction de 20% sur le premier article de PersonViewModel.shoppingCart
:
this.shoppingCart = ko.observableArray ([nouveau produit ("Bière", 10,99, nulle, .20), nouveau produit ("Brats", 7,99), nouveau produit ("Buns", 1.49, ['Produits de boulangerie', ' Chiens chauds']); ]);
si et si non
Fixationsle si
La liaison est une liaison conditionnelle. Si le paramètre que vous transmettez est évalué à true, le code HTML contenu sera affiché, sinon il est supprimé du DOM. Par exemple, essayez d’ajouter la cellule suivante à la
Vous avez enregistré !!! | l'élément n'apparaîtra que pour les articles ayant un rabais supérieur à 0 . De plus, étant donné que la réduction est observable, Knockout.js réévaluera automatiquement la condition à chaque changement. Ceci est juste une autre façon pour Knockout.js de vous aider à vous concentrer sur les données qui dirigent votre application.. Figure 15: rendu conditionnel d'une remise pour chaque produit Vous pouvez utiliser tout Expression JavaScript en tant que condition: Knockout.js essaiera d'évaluer la chaîne en tant que code JavaScript et utilisera le résultat pour afficher ou masquer l'élément. Comme vous l'avez peut-être deviné, le le |