Índice de acceso de $ parent en knockout.js

87

En knockout.js 2.1.0, en una plantilla que usa el enlace foreach, puede acceder al índice del elemento actual a través de la función $ index (). En un enlace foreach anidado, ¿hay alguna forma de acceder al índice de $ parent desde una plantilla?

Digamos que tengo una estructura de datos como esta:

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
    },
    ...
    ]};

Con esto, quiero imprimir la ruta a cada modelo, usando índices: [topModel-index subModel-index], para que la salida sea algo como:

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

He enlazado los modelos usando foreach, pero no puedo averiguar cómo acceder al índice de topModel en el contexto del subModel. El siguiente ejemplo muestra un enfoque que he probado, pero no funciona, ya que no puedo averiguar cómo acceder al índice del $ parent referrer.

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

Debe imprimir: 0 1, 0 2, 1 0, 1 1, 1 2, 2 0, 2 1, ...

Jørgen
fuente
En realidad, no lo necesitas ()después de $indexallí.
Matthew Schinckel
Además, si pudiera crear un jsfiddle con lo que tiene, eso lo haría más fácil. O publique su fuente de datos y vea el código del modelo.
Matthew Schinckel
Por ahora, solo estoy trabajando en la creación de prototipos, por lo que no tengo mucho más que el ejemplo dado. Sin embargo, estoy abierto a sugerencias que utilicen otros enfoques.
Jørgen
Tal vez describa lo que está tratando de hacer, en lugar de cómo . Puede haber un enfoque diferente.
Matthew Schinckel
Gracias. Cambié mi pregunta y, con suerte, ahora está más clara.
Jørgen

Respuestas:

185

para acceder al índice del uso del objeto padre

$parentContext.$index()

más bien que

$parent.index()
Brett Smith
fuente
Gracias. ¡Acabo de pasar siglos tratando de encontrar eso!
DavidHyogo
14
Aunque, para ser demasiado explícito en nombre de la estupidez, todavía tienes que hacerlo $parentContext.$index()con los padres. ; ^) Un poco más sobre $ parentContext aquí , fwiw.
ruffin
3
gracias - definitivamente vale la pena señalar que, en el contexto de un valor compuesto, necesitaría agregar el (); sin embargo, si estuviera vinculando un elemento al índice $ parentContext. $ según la pregunta, no lo necesita.
Brett Smith
5
Necesita paréntesis$parentContext.$index()
Jaider
4
Solo quería agregar que también $parentContext.$parentContext.$index()funciona como era de esperar.
Ryan Wheale
3

La forma más sencilla de averiguarlo es descargar "contexto de eliminación" para Chrome. Esto le muestra qué datos están vinculados a qué elemento y también le permite ver las funciones / variables disponibles para ese elemento vinculado en particular. Es una herramienta increíble para situaciones como estas.

Julian
fuente