2013-11-25 3 views
0

я еще совсем новичок в knockout.js и есть следующая проблема:Knockout.js сложные таблицы привязки данных

http://jsfiddle.net/ToastedSoul/wAyY7/

<td> 
    <!-- what to put here? --> 
</td> 
... 
"TableEntrySet":[ 
       { 
       "DisplayCode":"A", 
       "ColumnCode":"A4", 
       "RowCode":"L1", 
       }, 

получить данные в формате JSON с сервера и хотите визуализировать дату используя некоторые таблицы. Таблицы с надписью «level b text x.y» должны содержать значение «DisplayCode» в правильной ячейке (первая таблица: в «A4/L1» a «A» и «A4/S1» a «A»). Данные никогда не будут содержать несколько записей для одной ячейки.

«Сводная таблица» должна визуализировать все предыдущие таблицы, расположенные друг над другом. Таким образом, могут быть случаи, когда одна ячейка получает несколько значений (в моей скрипке: «A4/S1» получит «A» и «V», «A3/S4» получит «2V» или «VV»)

Я ищу элегантный способ заполнения этих таблиц.

Так как мне придется создавать несколько столбцов/строк/областей таблиц позже, мне не нужно, чтобы они были созданы, как в моей скрипке (но если это возможно, почему бы и нет!) ,

И если это слишком легко для вас, вы можете использовать нокаут-про: Что делать, если я хочу иметь только одну таблицу на страницах «предыдущий» и «следующий», чтобы просмотреть все эти заполненные таблицы (включая итоговый)?

+0

Теперь со значениями и цветами: http://jsfiddle.net/ToastedSoul/wAyY7/13/. Интересно, можно ли избежать повторения 'levelBItem.getTableEntry (Code, rowItem.Code)' звонков – ToastedSoul

ответ

0

Ваша проблема заключается в том, что вы делаете данные для самого внутреннего для наблюдения наблюдаемого массива RowNames. Каждый нокаут foreach является контекстуальным: он имеет только доступные ему данные. Два исключения: $parent, который дает вам доступ к данным непосредственного родительского foreach, если он существует, и $root, что дает вам доступ к представлению модель. Ни один из них действительно вам не поможет, поскольку нужные вам данные находятся в списке на модели корневого представления. You может потенциально использовать $index, чтобы попытаться вытащить правый член другого списка, но предполагается, что ваш массив RowNames и у него есть индексы, которые совпадают, что может и не быть.

В целом, лучше всего просто рефакторировать, чтобы вы фактически использовали данные, с которыми хотите работать, вместо RowNames и найдите другой способ получить значение заголовка строки.

+0

Я попытался преобразовать (во время процесса сопоставления) мои «TableEntrySets» во что-то более подходящее (какой-то ассоциативный массив), который позволил бы прямые привязки. Но я все еще очень новичок в нокауте/javascript, и мне это не удалось. Я упростил скрипку, может быть, слишком много; Первоначально я только зацикливал строки, в то время как я жестко закодировал свои четыре столбца. – ToastedSoul

+0

Это идея. Возможно, вы можете найти лучший способ, чем hardcoding, но независимо от того, вам нужно перебирать строки. –

Смежные вопросы