Gridstact: сделать виджет статичным и ввести ошибку

Я новичок для JavaScript и Gridstack. Моя работа заключается в создании панели инструментов на основе сетки. Наиболее близким примером для моей цели является демонстрационный пример knockout.html. Кроме того, мне нужно добавить несколько новых функций, основанных на этом примере. Вот проблема, с которой я сталкиваюсь.

  1. Мне нужно добавить выпадающее меню для каждого виджета, и он добавляется в шаблон, пожалуйста, обратитесь к коду ниже. Сейчас я использую кнопку для переключения выпадающего меню. Можно ли использовать правую кнопку мыши, чтобы открыть выпадающее меню?

  2. Когда я добавил метод с именем toggleDropdownMenu, я получаю ошибку типа "TypeError: this.toggleDropdownMenu не является функцией", эта функция должна быть где-то определена?

  3. Я хочу сделать указанный виджет статичным. Я добавил настройки attr при создании виджета наподобие staticGrid: true, но не работает. Как это можно исправить?

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

Пожалуйста, обратитесь к коду... Большое спасибо за любые советы!

<!DOCTYPE html>
<html lang="en">
<head>
    <!--[if lt IE 9]>
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Dash board demo</title>

    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" href="./dist/gridstack.css"/>    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.0/jquery-ui.js"></script>    
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
    <script src="./dist/gridstack.js"></script>

    <style type="text/css">
        .grid-stack {
            background: lightgoldenrodyellow;

        }

        .grid-stack-item-content {
            color: #2c3e50;
            text-align: center;
            background-color: #18bc9c;
        }
        .grid-stack-item-content button{
            background-color: Transparent;
            background-repeat:no-repeat;
            border: none;
            cursor:pointer;
            overflow: hidden;
            outline:none;
            color: white;
            position: relative;
        }
        .grid-stack-item-content .dropdown-submenu {
            position: relative;
        }
        .grid-stack-item-content .dropdown-submenu .dropdown-menu {
            top: 0;
            left: 100%;
            margin-top: -1px;
        }

    </style>
</head>
<body>
    <div class="container-fluid">
        <h1>Dashboard Demo</h1>

        <div>
            <button data-bind="click: addNewWidget">Add new widget</button>
        </div>

        <br>

        <div data-bind="component: {name: 'dashboard-grid', params: $data}"></div>
    </div>


    <script type="text/javascript">
        ko.components.register('dashboard-grid', {
            viewModel: {
                createViewModel: function (controller, componentInfo) {
                    var ViewModel = function (controller, componentInfo) {
                        var grid = null;

                        this.widgets = controller.widgets;

                        this.afterAddWidget = function (items) {
                            if (grid == null) {
                                grid = $(componentInfo.element).find('.grid-stack').gridstack({
                                    auto: false
                                }).data('gridstack');
                            }

                            var item = _.find(items, function (i) { return i.nodeType == 1 });
                            grid.addWidget(item);
                            ko.utils.domNodeDisposal.addDisposeCallback(item, function () {
                                grid.removeWidget(item);
                            });
                        };
                    };

                    return new ViewModel(controller, componentInfo);
                }
            },
            template:
                [
                    '<div class="grid-stack" data-bind="foreach: {data: widgets, afterRender: afterAddWidget}">',
                    '   <div class="grid-stack-item" data-bind="attr: {\'data-gs-x\': $data.x, \'data-gs-y\': $data.y, \'data-gs-width\': $data.width, \'data-gs-height\': $data.height, \'data-gs-auto-position\': $data.auto_position}">',
                    '       <div class="grid-stack-item-content">',
                    //'       <button data-bind="click: $root.deleteWidget">Delete me</button>',
                    '    <div class="dropdown">',
                    '    <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Click me',
                    '    <span class="caret"></span>',
                    '    </button>',
                    '    <ul class="dropdown-menu">',
                    '      <li data-bind="click: $root.deleteWidget"><a tabindex="-1" href="#">Delete</a></li>',
                    '      <li><a tabindex="-1" href="#">Change Color</a></li>',
                    '      <li><a tabindex="-1" href="#">Copy to</a></li>',
                    '      <li class="dropdown-submenu">',
                    '        <a class="plan" tabindex="-1" href="#">New dropdown <span class="caret"></span></a>',
                    '        <ul class="dropdown-menu">',
                    '          <li><a tabindex="-1" href="#">2nd level dropdown</a></li>',
                    '          <li><a tabindex="-1" href="#">2nd level dropdown</a></li>',
                    '          <li class="dropdown-submenu">',
                    '           <a class="test" href="#">Another dropdown <span class="caret"></span></a>',
                    '            <ul class="dropdown-menu">',
                    '              <li><a href="#">3rd level dropdown</a></li>',
                    '              <li><a href="#">3rd level dropdown</a></li>',
                    '            </ul>',
                    '          </li>',
                    '        </ul>',
                    '      </li>',
                    '    </ul>',
                    '       </div>',
                    '   </div>',
                    '   </div>',
                    '</div> '
                ].join('')
        });



        $(function () {
            var Controller = function (widgets) {
                var self = this;

                this.widgets = ko.observableArray(widgets);

                this.addNewWidget = function (i) {
                    this.widgets.push({
                        x: 0,
                        y: 0,
                        id: 'widget'+i,
                        width: i== 0 ? 2 : 1, //Math.floor(1 + 3 * Math.random()),
                        height: i== 0 ? 2 : 1, //Math.floor(1 + 3 * Math.random()),
                        auto_position: true
                    });
                    return false;
                };

                this.deleteWidget = function (item) {
                    self.widgets.remove(item);
                    return false;
                };

                /**
                this.toggleDropdownMenu(function(){
                    $('.dropdown-submenu a.test').on("click", function(e)
                    {
                        $(this).next('ul').toggle();
                        e.stopPropagation();
                        e.preventDefault();
                    });
                });
                **/
            };

            var widgets = [
                {x: 0, y: 0, width: 2, height: 2, staticGrid: true },                
                {x: 2, y: 0, width: 1, height: 1},
                {x: 3, y: 1, width: 2, height: 2},
                {x: 1, y: 2, width: 1, height: 1}
            ];

            var controller = new Controller(widgets);
            ko.applyBindings(controller);
        });
    </script>
</body>
</html>

0 ответов

Другие вопросы по тегам