Использование Dojos EnhancedGrid с подключаемыми модулями на стороне клиента

У меня есть EnhancedGrid с JsonRestStore, привязанным к серверному API Rest. Это мой код для него:

     <script>

        /**
        * Creates Dojo Store.
        */

        require(["dojo/store/JsonRest"], function (JsonRest) {
            myStore = new JsonRest({ handleAs: 'json', target: 
                'https://api.twitter.com/1/statuses/user_timeline.json'+
                '?trim_user=true&screen_name=twitter&count=100' });
        });

        var layout = [[
            { name: 'Created at', field: 'created_at', datatype: 'string', 
                width: '100px' },
            { name: 'Message', field: 'text', datatype: 'string', 
                width: 'auto', autoComplete: true },
            { name: 'Source', field: 'source', datatype: 'string', 
                width: '200px', filterable: false },
            { name: 'Retweets', field: 'retweet_count', datatype: 'number', 
                width: '100px', disabledConditions: ["startsWith", "notStartsWith"] }
        ]];

        /**
        * Creates Dojo EnhancedGrid.
        */

        require(["dojox/grid/DataGrid",
            "dojox/grid/EnhancedGrid",
            "dojo/data/ObjectStore",
            "dojox/grid/enhanced/plugins/Filter",
            "dojox/grid/enhanced/plugins/NestedSorting",
            "dojox/grid/enhanced/plugins/Pagination", 
            "dojo/domReady!"
        ], function (DataGrid, EnhancedGrid, ObjectStore) {

            var grid = new EnhancedGrid({
                id: 'grid',
                store: dataStore = new ObjectStore({ objectStore: myStore }),
                structure: layout,
                //clientSort: "true",
                rowsPerPage: 5,
                rowSelector: "20px",
                selectionMode: "single",
                plugins: {
                    filter: {
                        ruleCount: 5,
                        itemsName: "Tweets"
                    },
                    nestedSorting: true,
                    pagination: {}
                }
            });

            grid.placeAt('grid5');
            grid.startup();  
        });
    </script>
    <div id="grid5"></div>

Как видите, я использовал несколько плагинов для своей сетки. Плагин фильтра работает без проблем. Для этого я просто использую фильтрацию на стороне клиента. Но пагинация плагинов и вложенная сортировка не работают.

Сортировка: Нажатие на стрелку «по возрастанию» или «убыванию» не меняет порядок. Разбивка на страницы: переход к следующим 25 записям по-прежнему содержит те же 25 записей, что и предыдущая страница.

Для обоих плагинов кажется, что после нажатия он просто загружает новый json из бэкэнда и снова отображает его. Сетевой трафик также указывает на это. Есть ли решение заставить его работать на стороне клиента?


person Robin Wieruch    schedule 16.04.2013    source источник


Ответы (1)


Ваша служба REST должна поддерживать все операции, необходимые для плагинов! Если ваша служба поддерживает эти операции и все еще не работает, значит, что-то не так с тем, как плагины получают доступ к данным из вашего REST API.

Запустите ваше приложение с чем-то вроде firebug и посмотрите, что произойдет (= что запрошено с сервера), если вы нажмете на элементы сортировки/разбиения на страницы. Если ответ сервера не отсортирован или разбит на страницы, вам придется настроить плагины, чтобы они знали, как создать действительный URL-адрес (= URL-адрес, который на самом деле делает то, что вы от него ожидаете).

Другой способ — создать что-то на вашем сервере, которое сопоставляет запросы dojo с действительными запросами REST API.

person Lucian Depold    schedule 18.04.2013
comment
Почему можно использовать плагин фильтра только на стороне клиента, но не плагин пагинации? Я думаю, было бы неплохо сделать это на стороне клиента независимо от стороны сервера. Может быть, я мог бы использовать кеш памяти для этого? - person Robin Wieruch; 07.05.2013
comment
Разбиение на страницы предназначено для доступа к большим данным небольшими порциями (= страницы), поэтому пользователю не нужно ждать 3 минуты для доступа к 1 миллиону строк. Но он должен работать без службы REST. Посмотрите здесь: livedocs.dojotoolkit.org/dojox/grid/EnhancedGrid/ plugins/ под нумерацией страниц и запустите пример. Служба REST не включает только данные, созданные во время выполнения с помощью javascript! Помог ли вам мой ответ, вы не проголосовали за него / не приняли его. - person Lucian Depold; 08.05.2013
comment
Но в моем сценарии мне нужна служба отдыха в качестве бэкэнда. Поэтому я использую магазин JsonRest. Но я не хочу, чтобы модуль пагинации отправлял запросы на мой сервер. Я хочу разбиение на страницы только на клиентских данных. - person Robin Wieruch; 28.05.2013
comment
Я придумал получать все данные через jquery из моего бэкэнда. Затем я положил его в хранилище памяти. После этого можно использовать пагинацию только на стороне клиента. - person Robin Wieruch; 25.07.2013