Dentro de una expresión de enlace knockout.js, puedo usar el $data
, $parent
, and $root
pseudovariables. ¿Cómo puedo obtener el equivalente de esas pseudovariables cuando estoy usando un ko.computed
observable declarado en JavaScript?
Tengo un modelo de vista padre con una colección de niños, y el modelo de vista padre tiene un selectedChild
observable. Teniendo en cuenta que, puedo utilizar expresiones de enlace de datos para agregar una clase CSS a cualquier niño está actualmente seleccionado: "estoy seleccionado"
<ul data-bind="foreach: children">
<li data-bind="text: name,
css: {selected: $data === $root.selectedChild()},
click: $root.selectChild"></li>
</ul>
<script>
vm = {
selectedChild: ko.observable(),
children: [{name: 'Bob'}, {name: 'Ned'}],
selectChild: function(child) { vm.selectedChild(child); }
};
ko.applyBindings(vm);
</script>
Pero mis ViewModels se van a poner más complejo, y me gustaría para poder hacer algo más que simplemente agregar una única clase de CSS a un solo elemento. Realmente quiero hacer una propiedad computada isSelected
en el modelo de vista hijo, entonces puedo agregar otras propiedades calculadas que dependen de él.
He intentado sólo escribir código JavaScript que se refiere a $data
y $root
, en la remota posibilidad de que nocaut podría definir estas variables y de alguna manera hacer que sean de alcance cuando llama a mi función computed
evaluador:
{
name: 'Bob',
isSelected: ko.computed(function(){ return $data === $root.selectedChild(); })
}
Pero no tuve suerte: dentro de mi evaluador function
, ambos $data
y $root
son undefined
.
También intenté usar ko.contextFor
dentro de mi evaluador, ya que da acceso a $data
y $root
. Desafortunadamente, dentro de mi función de evaluador, contextFor
también siempre devuelve undefined
. (De todos modos, no tenía grandes esperanzas para esta estrategia, no está claro qué tan bien podría ser capaz de rastrear las dependencias si tuviera que ir detrás de su espalda así).
Siempre pude establecer manualmente una propiedad en cada modelo de vista hijo que hace referencia al modelo de vista padre. Pero sé que el nocaut tiene la capacidad de hacer esto por mí, y al menos me gustaría explorar si puedo usar sus mecanismos antes de escribir el mío.
parece que debería ser posible traducir la expresión anterior se une a un observable computarizada - después de todo, that's what knockout already does:
El otro truco es que las consolidaciones declarativas se implementan simplemente como observables calculadas.
Pero, ¿cómo hago para hacer frente a los $data
y $root
pseudovariables cuando estoy escribiendo mi propia observables computarizada?
¡gracias por su segundo ejemplo! – vittore
¿cómo llamarías a una función en la raíz, así como haciendo clic: $ root.selectedItem, dentro del mismo enlace? – FutuToad
por ejemplo, esto no funciona: haga clic en: function() {$ parent.openAlertDialogueEdit ($ data) //} $ de datos parece ser una copia, no la referencia real – FutuToad