knockout.js - attribute - knockout visible
¿Es posible vincular datos visibles a la negación("!") De una propiedad booleana de ViewModel? (7)
Me gustaría usar una propiedad en mi ViewModel para alternar qué ícono 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 un período de propiedad que es una matriz de meses, como esta:
var month = function() {
this.charted = ko.observable(false);
};
Al usar un elemento observable en una expresión, debe acceder a él como una función como:
visible: !charted()
Descargo de responsabilidad: esta solución es solo para fines de entretenimiento.
ko.extenders.not = function (target) {
target.not = ko.computed(function () {
return !target();
});
};
self.foo = ko.observable(true).extend({ not: null });
<div data-bind="text: foo"></div> <!-- true -->
<div data-bind="text: foo.not"></div> <!-- false -->
<!-- unfortunately I can''t think of a way to be able to use:
text: foo...not
-->
Es un poco confuso, ya que tienes que hacer
visible:!showMe()
Así que lo hice
<span data-bind="visible:showMe">Show</span>
<span data-bind="visible:!showMe()">Hide</span>
<label><input type="checkbox" data-bind="checked:showMe"/>toggle</label>
mi modelo es
var myModel={
showMe:ko.observable(true)
}
ko.applyBindings(myModel);
Check in fiddle http://jsfiddle.net/khanSharp/bgdbm/
Estoy de acuerdo con el comentario de John Papa de que debería haber un enlace hidden
incorporado. Hay dos ventajas para un enlace hidden
dedicado:
- Sintaxis más simple, es decir.
hidden: charted
lugar devisible: !charted()
. - Menos recursos, ya que Knockout puede observar el
charted
observable directamente, en lugar de crear uncomputed
para observar!charted()
.
Sin embargo, es lo suficientemente simple como para crear un enlace hidden
, así:
ko.bindingHandlers.hidden = {
update: function(element, valueAccessor) {
ko.bindingHandlers.visible.update(element, function() {
return !ko.utils.unwrapObservable(valueAccessor());
});
}
};
Puede usarlo igual que el enlace visible
incorporado:
<i class="icon-search" data-bind="hidden: charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i>
Para que el enlace tenga conocimiento de los cambios en la propiedad, copié el controlador de enlace visible y lo invertí:
ko.bindingHandlers.hidden = {
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
var isCurrentlyHidden = !(element.style.display == "");
if (value && !isCurrentlyHidden)
element.style.display = "none";
else if ((!value) && isCurrentlyHidden)
element.style.display = "";
}
};
Puede usar mi enlace switch/case enlace de switch/case , que incluye case.visible
y casenot.visible
.
<tbody data-bind="foreach: periods">
<tr>
<td data-bind="switch: true">
<i class="icon-search" data-bind="case.visible: $else, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="case.visible: charted, click: $parent.pie_it"></i>
</td>
</tr>
</tbody>
También podría tenerlo como
<i class="icon-search" data-bind="casenot.visible: charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="case.visible: $else, click: $parent.pie_it"></i>
También puede usar oculto así:
<div data-bind="hidden: isString">
<input type="text" class="form-control" data-bind="value: settingValue" />
</div>