Непонятное поведение Collapse Widget

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
voodooism
Сообщения: 48
Зарегистрирован: 2018.11.12, 10:29

Непонятное поведение Collapse Widget

Сообщение voodooism »

Столкнулся с непонятным для меня поведением Collapse виджета.

У меня есть интерфейс с многократно вложенными друг в друга коллапсами, выглядит это примерно так:

index.php

Код: Выделить всё

<?= Collapse::widget([
    'items' => [
        [
            'label' => 'Collapse1',
            'content' => $this->render('1'),
        ],
        [
            'label' => 'Collapse2',
            'content' => $this->render('2'),
        ],
        [
            'label' => 'Collapse3',
            'content' => $this->render('3'),
        ],
    ]
]); ?>
1.php

Код: Выделить всё

<?= Collapse::widget([
    'items' => [
        [
            'label' => 'Collapse1',
            'content' => $this->render('1_1'),
        ],
        [
            'label' => 'Collapse2',
            'content' => $this->render('1_2'),
        ],
        [
            'label' => 'Collapse3',
            'content' => $this->render('1_3'),
        ],
    ]
]); ?>
Суть проблемы заключается в том, что при рендеринге странички, автоматически срабатывает событие shown.bs.collapse относящееся к bootstrap-collapse(хотя визуально страница не меняется). В этом можно убедится подключив на странице с коллапсами следующий js код:

Код: Выделить всё

$('.collapse').on('shown.bs.collapse', function () {
    console.log(this);
});
В консоли отобразятся id коллапсов на которых сработало это событие.

Как я выяснил, это происходит по следующим причинам:
в методе run вызывается метод описаный в BootstrapWidgetTrait registerPlugin. В результате работы этого метода в тело HTML документа добавляется inline-скрипт следующего вида:
Изображение, что и порождает нежелательные события.

Из-за данной проблемы, мой js-код может корректно работать с коллапсами только в том случае если я помещаю его в конец данного inline-скрипта. Я не уверен правильное ли это поведение виджета, но в любом случае, самопроизвольное срабатывание событий `shown.bs.collapse` выглядит некорректно.

Есть идеи решения проблемы?
Ответить