Індекс доступу $ батьків у 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 в контексті підмоделі. Наступний приклад демонструє підхід, який я спробував, але він не працює, оскільки я не можу зрозуміти, як отримати доступ до індексу $ батьківського реферала.

<!--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там.
Matthew Schinckel

Крім того, якби ви могли створити jsfiddle з тим, що у вас є, це полегшило б. Або опублікуйте джерело даних і перегляньте код моделі.
Matthew Schinckel

Наразі я працюю лише над створенням прототипів, тому я не маю набагато більше, ніж наведений приклад. Однак я відкритий для пропозицій із використанням інших підходів.
Йорген

Можливо, опишіть, що ви намагаєтесь зробити, а не як . Може бути інший підхід.
Matthew Schinckel

Дякую. Я змінив своє запитання, і, сподіваюся, зараз це зрозуміліше?
Йорген

Відповіді:


185

для доступу до індексу використання батьківського об'єкта

$parentContext.$index()

а не

$parent.index()

Дякую. Просто витратив століття, намагаючись це знайти!
DavidHyogo

14
Хоча, щоб бути надмірно явним в ім'я безмозгу, вам все одно доведеться $parentContext.$index()з паренами. ; ^) Трохи більше про $ parentContext тут , fwiw.
jorffin

3
спасибі - безумовно, варто зазначити, в контексті складеного значення вам потрібно буде додати (), однак, якщо ви прив'язували елемент до індексу $ parentContext. $ відповідно до питання, яке вам не потрібно.
Бретт Сміт

5
Потрібні дужки$parentContext.$index()
Джайдер

4
Просто хотів додати, що $parentContext.$parentContext.$index()працює так само, як ви очікуєте.
Ryan Wheale

3

Найпростіший спосіб це дізнатись - завантажити "нокаут-контекст" для chrome. Це показує, які дані прив’язані до якого елемента, а також дозволяє побачити доступні функції / змінні для цього конкретного зв’язаного елемента. Це дивовижний інструмент для таких ситуацій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.