Индекс доступа $ parent в knockout.js


87

В knockout.js 2.1.0 в шаблоне, использующем привязку foreach, вы можете получить доступ к индексу текущего элемента с помощью функции $ index (). Есть ли способ получить доступ к индексу родительского элемента $ из шаблона во вложенной привязке foreach?

Скажем, у меня есть такая структура данных:

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

При этом я хочу напечатать путь к каждой модели, используя индексы: [topModel-index subModel-index], чтобы результат был примерно таким:

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

Я связал модели с помощью foreach, но не могу понять, как получить доступ к индексу topModel в контексте подмодели. В следующем примере показан подход, который я пробовал, но он не работает, поскольку я не могу понять, как получить доступ к индексу источника перехода $ parent.

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

Следует распечатать: 0 1, 0 2, 1 0, 1 1, 1 2, 2 0, 2 1, ...


На самом деле вам это не нужно ()после $indexтам.
Мэтью Шинкель,

Кроме того, если бы вы могли создать jsfiddle из того, что у вас есть, это упростило бы задачу. Или разместите свой источник данных и просмотрите код модели.
Мэтью Шинкель,

На данный момент я работаю только над прототипированием, поэтому у меня нет ничего, кроме данного примера. Однако я открыт для предложений с использованием других подходов.
Jørgen

Может быть, опишите, что вы пытаетесь сделать, а не как . Может быть другой подход.
Matthew Schinckel

Спасибо. Я изменил свой вопрос, и, надеюсь, теперь он более понятен?
Йорген

Ответы:


186

для доступа к индексу родительского объекта используйте

$parentContext.$index()

скорее, чем

$parent.index()

Спасибо. Просто потратил целую вечность, пытаясь это найти!
DavidHyogo

14
Хотя, чтобы быть чрезмерно явным во имя безмозглости, вам все равно придется обращаться $parentContext.$index()с пареной. ; ^) Еще немного о $ parentContext здесь , fwiw.
ruffin

3
спасибо - определенно стоит отметить, что в контексте составного значения вам нужно будет добавить (), однако, если вы привязываете элемент к индексу $ parentContext. $ в соответствии с вопросом, он вам не нужен.
Brett Smith

5
Нужны скобки$parentContext.$index()
Джайдер 09

4
Просто хотел добавить, $parentContext.$parentContext.$index()что тоже работает, как и следовало ожидать.
Райан Уил

3

Самый простой способ узнать это - загрузить «контекст выреза» для Chrome. Это показывает, какие данные привязаны к какому элементу, а также позволяет увидеть доступные функции / переменные для этого конкретного привязанного элемента. Это отличный инструмент для подобных ситуаций.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.