Несколько вложенных JQuery UI Accordion, сгенерированных с помощью шаблона Knockout, не связывают правильно

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

Код выглядит так:

У меня сложилось впечатление, что это может быть связано с тем, как я создаю цикл шаблонов, но я нахожусь в этом с ума - спасибо, кто-нибудь

ЗАМЕТКА:

Я попытаюсь прояснить проблему, с которой я столкнулся - (здесь, на скрипке: http://jsfiddle.net/QChon/aUJFg/4/)

Аккордеон и вложенные гармоники загружаются правильно, следуя модели представления (элемент с массивом "children", содержащий снова объекты Item, которые должны длиться бесконечно).

Кнопка "Добавить следующий элемент" добавляет родственника к текущему элементу и, следовательно, к текущей панели аккордеона, а "Добавить SubItem" добавляет дочерние элементы к текущим дочерним элементам и, следовательно, к вложенной панели аккордеона под текущей панелью.

Проблема в том, что когда я нажимаю кнопки, правильные элементы html добавляются в правильные места (т.е. Как заголовок и как панель содержимого), но классы jquery и идентификаторы не привязаны к созданным элементам управления html, поэтому не отображают и не вести себя правильно как часть структуры аккордеона. Надеюсь, что это несколько прояснилось.

1 ответ

Проблема заключается в вашей настраиваемой функции привязки

Вы проверяете, является ли текущий элемент аккордеон, изучая атрибут data-accordion, который не существует даже на правильно инициализированном аккордеоне. Во-вторых, даже если он найдет этот атрибут, он попытается "воссоздать" аккордеон на неправильном уровне. Класс контейнера аккордеона является родительским родителем относительно элемента, который вы получаете в методе обновления.

Поэтому, если вы измените свою функцию из этого

var existing = $(element).data("accordion"); 
if (existing) $(element).accordion("destroy").accordion(options);

к этому

var existing = $(element).parent().parent().hasClass("ui-accordion"); 
if (existing) $(element).parent().parent().accordion('refresh');

он должен работать должным образом.

http://jsfiddle.net/M9222/1/

licensed under cc by-sa 3.0 with attribution.