Je voudrais utiliser une propriété sur mon ViewModel pour basculer l'icône à afficher sans créer une propriété calculée distincte de l'inverse. Est-ce possible?
<tbody data-bind="foreach: periods">
<tr>
<td>
<i class="icon-search" data-bind="visible: !charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i>
</td>
</tr>
</tbody>
My ViewModel a une propriété périodes qui est un tableau de mois, comme ceci:
var month = function() {
this.charted = ko.observable(false);
};
knockout.js
agradl
la source
la source
Réponses:
Lorsque vous utilisez une observable dans une expression, vous devez y accéder en tant que fonction telle que:
visible: !charted()
la source
hidden
liaison dans la v3.5.0Je suis d'accord avec le commentaire de John Papa selon lequel il devrait y avoir une
hidden
reliure intégrée . Il y a deux avantages à unehidden
liaison dédiée :hidden: charted
au lieu devisible: !charted()
.charted
directement, plutôt que de créer uncomputed
pour observer!charted()
.C'est assez simple pour créer une
hidden
liaison, cependant, comme ceci:Vous pouvez l'utiliser comme la
visible
liaison intégrée :la source
return !ko.utils.unwrapObservable(valueAccessor());
hidden
reliure par votre commentaire. (BTW, j'utilisais CoffeeScript dans mon projet au moment où j'ai publié ceci à l'origine. La syntaxe de CoffeeScript ne rend pas évident quand un retour est intentionnel.)C'est peu déroutant, comme tu dois le faire
alors je l'ai fait
mon modèle est
Enregistrer violon http://jsfiddle.net/khanSharp/bgdbm/
la source
Vous pouvez utiliser ma liaison commutateur / boîtier , qui comprend
case.visible
etcasenot.visible
.Vous pourriez aussi l'avoir comme
la source
Afin de rendre la liaison consciente des modifications apportées à la propriété, j'ai copié le gestionnaire de liaison visible et je l'ai inversé:
la source
Avertissement: cette solution est uniquement à des fins de divertissement.
la source
J'avais le même problème sur la façon d'utiliser un opposé d'une observable booléenne. J'ai trouvé une solution simple:
Maintenant, sur votre HTML, vous devriez le faire
Lorsque le programme démarre, seul "Text1" est visible car "false === false is TRUE" et Text2 n'est pas visible.
Disons que nous avons un bouton qui invoque l'événement rassemblerPlacesData on click. Maintenant Text1 ne sera plus visible car "true === false is FALSE" et Text 2 ne sera visible que.
Une autre solution possible pourrait être l'utilisation d'observables calculés, mais je pense que c'est une solution trop compliquée pour un problème si simple.
la source
Peut également utiliser caché comme ceci:
la source