À l'intérieur d'un knockout.js expression de liaison, je peux utiliser l' $data
, $parent
, et $root
pseudovariables. Comment puis-je obtenir l'équivalent de ces pseudovariables quand je suis à l'aide d'un ko.computed
observables déclaré en JavaScript?
J'ai un parent viewmodel avec une collection de l'enfant et le parent viewmodel a un selectedChild
observables. Étant donné que, je peux utiliser des expressions de liaison de données pour ajouter une classe CSS à celle de l'enfant qui est actuellement sélectionné:
<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>
Mais mon viewmodel sont en cours pour obtenir plus complexe, et j'aimerais "suis-je choisi?" pour être en mesure de faire plus que simplement l'ajout d'une seule classe CSS à un élément unique. J'ai vraiment envie de faire un isSelected
propriété calculée sur l'enfant viewmodel, donc, je peux alors ajouter d'autres propriétés calculées qui en dépendent.
J'ai essayé d'écrire du JavaScript qui fait référence à l' $data
et $root
, sur la chance que knock-out pourrait définir ces variables et en quelque sorte de leur portée quand elle appelle mon computed
évaluateur de fonction:
{
name: 'Bob',
isSelected: ko.computed(function(){ return $data === $root.selectedChild(); })
}
Mais pas de chance: à l'intérieur de mon évaluateur function
, les deux $data
et $root
sont undefined
.
J'ai aussi essayé d'utiliser ko.contextFor
à l'intérieur de mon évaluateur, car il donne accès à l' $data
et $root
. Malheureusement, à l'intérieur de mon évaluateur de fonction, contextFor
également toujours les retours undefined
. (Je n'ai pas de grands espoirs pour cette stratégie de toute manière, il n'est pas évident de knock-out serait en mesure de suivre les dépendances si je devais aller derrière son dos comme ça.)
J'ai toujours pu définir manuellement une propriété sur chaque enfant viewmodel qui fait référence à la société mère viewmodel. Mais je sais que knock-out a la capacité de le faire pour moi, et je voudrais explorer au moins savoir si je peut utiliser ses mécanismes avant de m'en aller écrire mon propre.
Il me semble qu'il devrait être possible de traduire le ci-dessus expression de liaison à un calculées observables -- après tout, c'est ce que knock-out déjà fait:
L'autre astuce est que déclarative liaisons sont simplement mises en œuvre calculé observables.
Mais comment dois-je traiter avec l' $data
et $root
pseudovariables quand j'écris mes propres calculées observables?