Datatables и Golden Layout - .DataTable() не вызывается во всплывающем окне

У меня простой DataTable() в золотом макете контейнера:

<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>

<script type="text/javascript" src="../../static/js/jq.min.js"></script>
<script type="text/javascript" src="../../static/js/gl.min.js"></script>
<script type="text/javascript" src="../../static/js/dt.js"></script>

<link type="text/css" rel="stylesheet" href="../../static/css/gl-base.css" />
<link type="text/css" rel="stylesheet" href="../../static/css/gl-dark-theme.css" />
<link rel="stylesheet" type="text/css" href="../../static/css/dt.css"/>
<link rel="stylesheet" type="text/css" href="../../static/css/dt-custom.css"/>

</head>
<body>
    <script>
     function getTable() {
         return "<table id=\"testTable\" class=\"testTable\" cellspacing=\"0\">\n" +
        "        <thead>\n" +
        "            <tr>\n" +
        "                <th>Name</th>\n" +
        "                <th>Position</th>\n" +
        "                <th>Office</th>\n" +
        "                <th>Age</th>\n" +
        "                <th>Start date</th>\n" +
        "                <th>Salary</th>\n" +
        "            </tr>\n" +
        "        </thead>\n" +
        "        <tbody>\n" +
        "            <tr>\n" +
        "                <td>Tiger Nixon</td>\n" +
        "                <td>System Architect</td>\n" +
        "                <td>Edinburgh</td>\n" +
        "                <td>61</td>\n" +
        "                <td>2011/04/25</td>\n" +
        "                <td>$320,800</td>\n" +
        "            </tr>\n" +
        "            <tr>\n" +
        "                <td>Garrett Winters</td>\n" +
        "                <td>Accountant</td>\n" +
        "                <td>Tokyo</td>\n" +
        "                <td>63</td>\n" +
        "                <td>2011/07/25</td>\n" +
        "                <td>$170,750</td>\n" +
        "            </tr>\n" +
        "            <tr>\n" +
        "                <td>Ashton Cox</td>\n" +
        "                <td>Junior Technical Author</td>\n" +
        "                <td>San Francisco</td>\n" +
        "                <td>66</td>\n" +
        "                <td>2009/01/12</td>\n" +
        "                <td>$86,000</td>\n" +
        "            </tr>\n" +
        "        </tbody>\n" +
        "    </table>"
}

var config = {
   content: [{
        type: 'row',
        content: [
           {
            type:'component',
            componentName: 'testComponent'
           }]
        }]
   };

var myLayout = new GoldenLayout( config );

myLayout.registerComponent( 'testComponent', function(container, state){
        container.getElement().append(getTable());
});

myLayout.init();</script>



<script type="text/javascript">

$(document).ready(function() {
    $('#testTable').DataTable();
} );

</script>

</body>
</html>

Таблица отображается правильно с DataTable() Стили при открытии в браузере, однако, когда я открываю вдову, таблица теряет все стили и возвращается к основному HTML.

После прочтения документации по GL я думаю, что мне нужно подписаться на событие open в новом контейнере всплывающих окон GL и вызвать table.DataTable() но я только сейчас изучаю JavaScript, jQuery и т. д. Я не уверен, где бы я это сделал?

1 ответ

Это связано с тем, что, когда Golden Layout открывает новое окно, он не копирует ваш текущий компонент в новое окно, а создает совершенно новый с тем же состоянием. Это означает, что вложение в DataTables теряется при перестройке компонента. Для получения дополнительной информации см. Следующий список (это не очень помогает, но дает объяснение): Работа с всплывающими окнами

Чтобы получить эту работу, как вы хотите, вам нужно сделать две вещи:

Первое: включите popoutWholeStack в настройках вашей конфигурации

var config = {
"settings": {
    "popoutWholeStack": true,
},
content: [{
    type: 'row',
    content: [
       {
        type:'component',
        componentName: 'testComponent'
       }]
    }]
};

Второе: добавьте обработчик stateChanged и присоедините его к DataTables. Поместите это перед вызовом init().

myLayout.on('stateChanged', () => {
    $('#testTable').DataTable();
});

myLayout.init();
Другие вопросы по тегам