dojo dgrid с кнопкой перезагрузки/обновления хранилища из URL-адреса (данные json)

Во-первых, я использую dojo 1.1.0 и dgrid 0.4.0. Я создаю страницу с несколькими dgrids на ней. Одна сетка, в частности, должна загружать данные JSON из URL-адреса и отображать их. В настоящее время он отлично работает с хранилищем RequestMemory. однако это хранилище «памяти». в то время как это может быть тривиально для некоторых других, мне нужно найти способ загрузить данные, как это делается сейчас, а затем добавить кнопку обновления на экран, которая вызывает необходимые функции/методы для перезагрузки данных из URL-адреса и повторно заполнить dgrid.

Данные JSON поступают из URL-адреса, отформатированного следующим образом:

[{"id":1,"name":"trans1","username":"trans1","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":2,"name":"trans2","username":"trans2","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":3,"name":"trans3","username":"trans3","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":4,"name":"trans4","username":"trans4","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":5,"name":"trans5","username":"trans5","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":6,"name":"trans6","username":"trans6","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false}]

Require, который вы увидите ниже, на самом деле содержит гораздо больше, чем просто эту сетку... отсюда и все лишнее.

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

Вот код, который я сейчас использую для начальной загрузки сетки (работает) и кнопки обновления, которая мне так нужна для работы.

require([ 'dojo/store/Observable' ,'dijit/Dialog', 'dijit/form/Select', 'dijit/form/MultiSelect', 'dijit/form/TextBox', 'dijit/layout/TabContainer', 'dijit/layout/ContentPane','dojo/request', 'dojo/request/xhr', 'dijit/form/ToggleButton', 'dijit/form/Button', 'dojo/parser', 'dojo/_base/declare', 'dgrid/Grid', 'dgrid/Selection', 'dgrid/Editor', 'dgrid/extensions/ColumnHider', 'dgrid/extensions/Pagination', 'dstore/RequestMemory', 'dijit/form/Select', 'dijit/registry','dojox/data/XmlStore', 'dojo/domReady!'], function (Observable, Dialog, Select, MultiSelect, TextBox, TabContainer, ContentPane, request, xhr, ToggleButton, Button, parser, declare, Grid, Selection, Editor, ColumnHider, Pagination, RequestMemory, Select, registry, XmlStore) {


//workers dgrid
    var workersStore = new RequestMemory({ target: '/autoAssign/getWorkers.aa?TASKTYPE=transport&INACTIVE=FALSE' });        
    var workerGrid = new (declare([ Grid, Selection, Pagination, Editor, ColumnHider ]))({
        collection: workersStore,
        className: 'dgrid-autoheight',
        id: 'workerGrid',
        rowsPerPage: 6,
        columns: {
            name: 'Name',
            username: {
                label: 'username',
                hidden: true
            },
            status: 'Status',
            assignedNum: 'Assigned',
            completedNum: 'Completed',
            avgTime: 'Average',
            aaOn: {
		      label: 'Auto Assign',
		      editor: 'checkbox',
                  }
        }
    }, 'gridNode');
    workerGrid.on("dgrid-datachange",function(evt) {
       var row = workerGrid.row(evt); 
       if (evt.cell.column.id == 'aaOn') {
           var promise = request('/autoAssign/setUserAaStatus.aa?USERNAME='+row.data.username+'&TASKTYPE=transport&STATUS='+evt.value);
       }
    });
    workerGrid.startup();


//Add refresh Button
      var addRefreshButton = new Button({
        label: "Refresh",
        style: 'float:right;',
        onClick: function(){
           var promise = workersStore.fetch();
           var result = promise.then(function(data){
               workerGrid.set("collection", workersStore);
               workerGrid.refresh();
               alert("refresh pushed");
           });
        }
    }, "refresh").startup(); 


}

[{"id":1,"name":"trans1","username":"trans1","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":2,"name":"trans2","username":"trans2","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":3,"name":"trans3","username":"trans3","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":4,"name":"trans4","username":"trans4","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":5,"name":"trans5","username":"trans5","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":6,"name":"trans6","username":"trans6","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false}]

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


person BLWedge09    schedule 26.02.2015    source источник


Ответы (1)


Технически, чтобы делать то, что вы хотите, вам делает нужно каким-то образом обновить локальное хранилище. dstore/RequestMemory по существу представляет собой композицию dstore/Request и dstore/Cache, где один запрос fetch выполняется немедленно, а затем кэширующее хранилище заполняет все будущие операции выборки. Чтобы принудительно обновить хранилище с сервера, вам в основном нужно сообщить хранилищу, что его кеш больше не действителен, а затем повторно запросить все элементы с сервера. Это равносильно следующему:

workersStore.invalidate(); // Invalidate the cache
workersStore.fetch(); // Perform a new request for all items
workerGrid.refresh();

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

(Вызов fetch важен — если вы не вызовете fetch выше, ваша сетка, вероятно, не будет работать так, как вы ожидаете. Модули dgrid OnDemandGrid и Pagination выполняют ранжированные запросы, используя fetchRange, и если Cache не знает, что у него есть все данные хранилища, он просто пропустит их в исходное хранилище, которым в данном случае является запрос, который попытается попасть на сервер, за исключением того, что ваша служба, по-видимому, не оборудована для обработки ранжированных запросов, поэтому она будет просто возвращать весь набор данных каждый раз. )

По общему признанию, я бы сказал, что это больше информации, чем кто-то, использующий RequestMemory, должен знать, поэтому я, вероятно, собираюсь отправить вопрос о каком-то API для обновления и/или обновления target. Однако 3 строки кода выше — это TL; DR.

person Ken Franqueiro    schedule 27.02.2015
comment
Обновление: отправлен запрос на включение, чтобы упростить задачу: github.com/SitePen/dstore/pull/106< /а> - person Ken Franqueiro; 27.02.2015
comment
СПАСИБО! Недействительный () — это именно то, чего мне не хватало. На самом деле я ранее пытался выполнить выборку, а затем обновить () сетку ... и это действовало так, как будто ничего не произошло. Это сработало отлично. Удивительно, что я искал 3 дня и нигде не мог найти это задокументировано. - person BLWedge09; 27.02.2015
comment
Кен, как ни странно, я только что понял особенность простой версии решения, которое вы разместили. Если записи добавляются по URL-адресу (исходному источнику данных), хранилище обновляется с этими записями просто отлично. Однако если записи удаляются из исходного источника данных, хранилище не удаляет их. Я ожидал, что он полностью перезагрузит хранилище Requestmemory из URL-адреса в обоих случаях. Любое предложение о том, как заставить работать сценарий удаления? - person BLWedge09; 04.03.2015
comment
Мужик, это хороший улов. Можете ли вы попробовать позвонить workersStore.cachingStore.setData([]) сразу после аннулирования? Если это сработает, я добавлю примечание к своему PR (не уверен, что действительно смогу поместить это в PR, поскольку технически я считаю возможным использовать что-то другое, кроме памяти, в качестве хранилища кэширования). - person Ken Franqueiro; 04.03.2015
comment
Кен, да, это сделало это. Еще раз спасибо. Поскольку вы упомянули альтернативу, что бы вы предложили использовать в качестве хранилища (в будущем) для моей ситуации? Что лучше подходит для вызовов по запросу с URL-адреса, который возвращает JSON? - person BLWedge09; 04.03.2015
comment
Если в качестве альтернативы вы имеете в виду, что я говорю, что можно использовать что-то другое, кроме памяти, в качестве хранилища кэширования, все, что я имею в виду, это то, что технически вы можете передать хранилище в cachingStore при создании экземпляра, и он будет использовать это вместо Memory. Я добавлю комментарий к своему PR и спрошу Криса, насколько интенсивно будет использоваться/поддерживаться этот случай. - person Ken Franqueiro; 04.03.2015
comment
Воскрешение этой старой темы, потому что я считаю, что совет здесь больше не кажется верным. У меня есть хранилище RequestMemory (dstore 1.2.1), которое загрузило свои данные для отображения в dgrid (0.4.2). Вызов RequestMemory::refresh() в хранилище приводит к вызову Cache::invalidate(), который устанавливает this.allLoaded = false, но затем refresh() вызывает fetch(), который вызывает Cache::_fetch, проверяет this.isAvailableInCache(), который проверяет this.isValidFetchCache на истинность, поэтому используются кэшированные данные. Я схожу с ума, пытаясь заставить Кэш вести себя. Где-то есть обсуждение, которое я пропустил? - person Neek; 14.05.2021