Каков стандартный способ работы с многомерными массивами с помощью Knockout?
Допустим, вы хотите сгенерировать динамическую таблицу с помощью KnockoutJS. Строки и столбцы таблицы генерируются из observableArrays. Данные внутри каждой ячейки также являются наблюдаемыми (данные привязаны к текстовым полям). Данные внутри каждой ячейки также должны быть проверены методом нокаута.
Я использую что-то подобное для генерации значения моих текстовых полей:
data-bind="value: $root.qty[$index()][$parentContext.$index()]"
Это внутри двух foreach для tbody:
<tbody data-bind="foreach: $root.styleColors">
<tr>
<td data-bind="text: StyleColorName, visible: $root.showFirstColumn"></td>
<!-- ko foreach: $root.sizes -->
<td>
<input type="text" class="qty" data-bind="value: $root.qty[$index()][$parentContext.$index()]"/>
</td>
<!-- /ko -->
</tr>
</tbody>
Это работает хорошо, но мне нужно иметь возможность динамически изменять данные в зависимости от того, какой элемент я редактирую. Как только я изменяю количество столбцов или строк, это вызывает всевозможные проблемы. Я уменьшил многие из этих проблем, используя расширитель throttle, заставив рендеринг ждать обеих строк. и столбцы, наблюдаемые перед рендерингом.
Каждый раз, когда я меняю текущий редактируемый элемент, я регенерирую многомерный массив qty[][] с использованием простых массивов javascript, и каждое фактическое значение является наблюдаемым.
Вот пример типичной проблемы, которая у меня есть. Для этого конкретного примера я проверяю минимальное и максимальное значение для моих количественных значений (ячеек). Но я получаю следующее исключение (Uncaught TypeError: не удается прочитать «правила» свойств неопределенного значения), когда я перепривязываю таблицу, содержащую меньше строк или меньше столбцов. Я меняю observableArrays для строк и столбцов, привязка data-bind="$root.qty[$index()][$parentContext.$index()]" больше недействительна, потому что один из индексов выходит за пределы граница.
Что мне не хватает?
Спасибо!