Accéder à l'index de $ parent dans knockout.js

87

Dans knockout.js 2.1.0, dans un modèle utilisant la liaison foreach, vous pouvez accéder à l'index de l'élément actuel via la fonction $ index (). Dans une liaison foreach imbriquée, existe-t-il un moyen d'accéder à l'index du $ parent à partir d'un modèle?

Disons que j'ai une structure de données comme celle-ci:

var application = {
  topModel: [
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]}, // this has top:0 and sub:0
      {subModel: [{'foo2':'foo2'}, { 'bar2':'bar2'}]} // this has top:0 and sub:1
    },
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:1 sub:0
    },
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:2 sub:0
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:2 sub:1
    },
    ...
    ]};

Avec cela, je veux imprimer le chemin vers chaque modèle, en utilisant les indices: [topModel-index subModel-index], de sorte que la sortie soit quelque chose comme:

[0 0]
[0 1]
[1 0]
[2 0]
[2 1]
...

J'ai lié les modèles en utilisant foreach, mais je ne peux pas comprendre comment accéder à l'index de topModel dans le contexte du sous-modèle. L'exemple suivant montre une approche que j'ai essayée, mais cela ne fonctionne pas, car je ne peux pas comprendre comment accéder à l'index du référent $ parent.

<!--ko foreach: topModel -->
<!--ko foreach: subModel -->
  [<span data-bind="text: $parent.index()"></span>
  <span data-bind="text: $index()"></span>]
<!--/ko-->
<!--/ko-->

Doit imprimer: 0 1, 0 2, 1 0, 1 1, 1 2, 2 0, 2 1, ...

Jørgen
la source
Vous n'avez pas vraiment besoin de ça ()après $indexlà.
Matthew Schinckel
De plus, si vous pouviez créer un jsfiddle avec ce que vous avez, cela faciliterait les choses. Ou publiez votre source de données et affichez le code du modèle.
Matthew Schinckel
Pour l'instant, je ne travaille que sur le prototypage, donc je n'ai pas beaucoup plus que l'exemple donné. Cependant, je suis ouvert aux suggestions utilisant d'autres approches.
Jørgen
Décrivez peut-être ce que vous essayez de faire, plutôt que comment . Il peut y avoir une approche différente.
Matthew Schinckel
Merci. J'ai changé ma question, et j'espère que c'est plus clair maintenant?
Jørgen

Réponses:

186

pour accéder à l'index de l'objet parent utiliser

$parentContext.$index()

plutôt que

$parent.index()
Brett Smith
la source
Merci. Je viens de passer des siècles à essayer de trouver ça!
DavidHyogo
14
Cependant, pour être trop explicite au nom de l'insensé, vous devez toujours le faire $parentContext.$index()avec les parents. ; ^) Un peu plus sur $ parentContext ici , fwiw.
ruffin
3
merci - il vaut vraiment la peine de noter, dans le contexte d'une valeur composite, vous devrez ajouter le (), mais si vous liez un élément à l'index $ parentContext. $ selon la question, vous n'en avez pas besoin.
Brett Smith
5
Besoin de parenthèses$parentContext.$index()
Jaider
4
Je voulais juste ajouter que cela $parentContext.$parentContext.$index()fonctionne comme vous vous attendez aussi.
Ryan Wheale
3

Le moyen le plus simple de le savoir est de télécharger le "contexte de knockout" pour Chrome. Cela vous montre quelles données sont liées à quel élément et vous permet également de voir les fonctions / variables disponibles pour cet élément lié particulier. C'est un outil incroyable pour des situations comme celles-ci.

julien
la source