Índice de acesso de $ parent em knockout.js

87

Em knockout.js 2.1.0, em um modelo usando a ligação foreach, você pode acessar o índice do item atual por meio da função $ index (). Em uma vinculação foreach aninhada, há alguma maneira de acessar o índice do $ parent a partir de um modelo?

Digamos que eu tenha uma estrutura de dados 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
    },
    ...
    ]};

Com isso, quero imprimir o caminho para cada modelo, usando índices: [topModel-index subModel-index], para que a saída seja algo como:

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

Eu limitei os modelos usando foreach, mas não consigo descobrir como acessar o índice do topModel no contexto do subModel. O exemplo a seguir mostra uma abordagem que tentei, mas não funciona, pois não consigo descobrir como acessar o índice do referenciador $ parent.

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

Deve imprimir: 0 1, 0 2, 1 0, 1 1, 1 2, 2 0, 2 1, ...

Jørgen
fonte
Você realmente não precisa disso ()depois de $indexlá.
Matthew Schinckel
Além disso, se você pudesse criar um problema com o que tem, seria mais fácil. Ou publique sua fonte de dados e visualize o código do modelo.
Matthew Schinckel
Por enquanto, estou trabalhando apenas na prototipagem, então não tenho muito mais do que o exemplo dado. Estou aberto a sugestões de outras abordagens, no entanto.
Jørgen
Descreva o que você está tentando fazer, em vez de como . Pode haver uma abordagem diferente.
Matthew Schinckel
Obrigado. Mudei minha pergunta e espero que esteja mais claro agora.
Jørgen

Respostas:

185

para acessar o índice do objeto pai, use

$parentContext.$index()

ao invés de

$parent.index()
Brett Smith
fonte
Obrigado. Passei muito tempo tentando encontrar isso!
DavidHyogo
14
Porém, para ser abertamente explícito em nome da falta de cérebro, você ainda precisa $parentContext.$index()usar os parênteses. ; ^) Um pouco mais sobre $ parentContext aqui , fwiw.
ruffin de
3
obrigado - definitivamente vale a pena notar, no contexto de um valor composto, você precisaria adicionar o (), no entanto, se você estivesse vinculando um elemento ao índice $ parentContext. $ de acordo com a pergunta, você não precisa dele.
Brett Smith
5
Precisa de parênteses$parentContext.$index()
Jaider
4
Só queria adicionar que $parentContext.$parentContext.$index()funciona como você esperaria também.
Ryan Wheale
3

A maneira mais fácil de descobrir é fazer o download do "contexto knockout" para o Chrome. Isso mostra quais dados estão vinculados a qual elemento e também permite que você veja as funções / variáveis ​​disponíveis para esse elemento vinculado específico. É uma ferramenta incrível para situações como essas.

Julian
fonte