Me gustaría usar una propiedad en mi ViewModel para alternar qué icono mostrar sin crear una propiedad computada separada de la inversa. es posible?
<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>
Mi ViewModel tiene períodos de propiedad que son una variedad de meses, como este:
var month = function() {
this.charted = ko.observable(false);
};
knockout.js
agradl
fuente
fuente
Respuestas:
Al usar un observable en una expresión, debe acceder a él como una función como:
visible: !charted()
fuente
hidden
enlace en v3.5.0Estoy de acuerdo con el comentario de John Papa de que debería haber un
hidden
enlace incorporado . Hay dos beneficios para unhidden
enlace dedicado :hidden: charted
en vez devisible: !charted()
.charted
directamente, en lugar de crear uncomputed
para observar!charted()
.Sin
hidden
embargo, es lo suficientemente simple como para crear un enlace, como este:Puede usarlo como el
visible
enlace incorporado :fuente
return !ko.utils.unwrapObservable(valueAccessor());
hidden
enlace por su comentario. (Por cierto, estaba usando CoffeeScript en mi proyecto en el momento en que publiqué esto originalmente. La sintaxis de CoffeeScript no lo hace obvio cuando un retorno es intencional)Es un poco confuso, como tienes que hacer
Así que lo hice
mi modelo es
Comprobar el violín http://jsfiddle.net/khanSharp/bgdbm/
fuente
Podrías usar mi encuadernación de interruptor / caja , que incluye
case.visible
ycasenot.visible
.También podrías tenerlo como
fuente
Para que el enlace sea consciente de los cambios en la propiedad, copié el controlador de enlace visible y lo invertí:
fuente
Descargo de responsabilidad: esta solución es solo para fines de entretenimiento.
fuente
Estaba teniendo el mismo problema sobre cómo usar un opuesto de un observable booleano. He encontrado una solución fácil:
Ahora en tu HTML deberías hacer esto
Cuando se inicia el programa, solo "Text1" es visible porque "false === false es TRUE" y Text2 no es visible.
Digamos que tenemos un botón que invoca el evento collectPlacesData al hacer clic. Ahora Text1 no estará visible porque "true === false es FALSE" y Text 2 solo estará visible.
Otra posible solución podría ser el uso de observables computados, pero creo que es una solución demasiado complicada para un problema tan simple.
fuente
También se puede usar oculto así:
fuente