Как обновить сетку данных

Я создаю dojox.grid.datagrid и заполняю содержимое из массива, как в последнем примере на странице. В течение времени я изменяю значение этого массива в коде. Как обновить содержимое этой сетки? Как загрузить новые данные из измененного массива?

6 ответов

Решение

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

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

В идеале хранилище - это ваш массив, которым вы манипулируете во время работы приложения, и вам не нужно синхронизировать массив с сеткой. Просто используйте ItemFileWriteStore в качестве держателя данных, если это невозможно.

Кроме того, использование API-идентификатора данных dojo значительно упрощает поиск элементов в сетке, если это возможно. Предполагая, что вы знаете, когда элемент обновляется, удаляется или изменяется в вашем приложении, вы сможете изменять сеточное хранилище по мере необходимости, когда происходит действие. Это определенно предпочтительный подход. Если вы не можете этого сделать, вам придется сделать общую выборку и использовать обратный вызов onComplete для ручной синхронизации ваших массивов, что будет очень медленным и не будет хорошо масштабироваться, и в этом случае вы можете просто создать новый магазин. вместе и назначить его в сетке с grid.setStore (myNewStore)

Вот скрипка с базовой операцией создания, обновления и удаления: http://jsfiddle.net/BC7yT/11/

Все эти примеры используют преимущества объявления личности при создании магазина.

var store = new dojo.data.ItemFileWriteStore({
    data: {
        identifier : 'planet',
        items: itemList
    }
});

ОБНОВЛЕНИЕ ИСКЛЮЧИТЕЛЬНОГО ПУНКТА:

//If the store is not in your scope you can get it from the grid
var store = grid.store;
//fetchItemByIdentity would be faster here, but this uses query just to show 
//it is also possible
store.fetch({query : {planet : 'Zoron'},
             onItem : function (item ) {

                  var humans = store.getValue(item, 'humanPop');
                  humans += 200;
                  store.setValue(item, 'humanPop', humans);

              }
        });

ВСТАВЬТЕ НОВЫЙ ПУНКТ:

store.newItem({planet: 'Endron', humanPop : 40000, alienPop : 9000});
               } catch (e) { 
                  //An item with the same identity already exists
               }

УДАЛИТЬ ПУНКТ:

store.fetchItemByIdentity({ 'identity' : 'Gaxula',  onItem :  function (item ) {
    if(item == null) {
         //Item does not exist
    } else {
        store.deleteItem(item);
    }
}});

Следующий фрагмент кода может быть использован для обновления сетки:

var newStore = new dojo.data.ItemFileReadStore({data: {... some new data ...});
var grid = dijit.byId("gridId");
grid.setStore(newStore);

РЕДАКТИРОВАТЬ:

Справочное руководство по сетке данных Dogo (пример добавления / удаления строк, обновление примеров данных сетки)

(Я полагаю, у вас уже есть рабочая сетка, и вы хотите полностью изменить хранилище сетки)

  1. Создайте новое хранилище данных с новым значением:

    dataStore = new ObjectStore({ objectStore:new Memory({ data: data.items }) });
    

    (данные являются ответом на запрос ajax для меня)

  2. Измените магазин вашей сетки с новым:

    grid.store = dataStore;
    
  3. Визуализация:

    grid.render();
    

Это обновит Grid Store и обновит View Grid в последней версии Dojo 1.9

grid.store = store;
grid._refresh();

У меня был серверный фильтрованный EnhancedGrid, который радостно обновлялся, меняя магазин и показанный в других ответах.

Однако у меня была другая EnhancedGrid, которая не обновлялась при применении фильтра. Возможно, это связано с тем фактом, что он был отфильтрован на стороне клиента (но данные все еще поступают с сервера, использующего хранилище JsonRest), но я на самом деле не знаю причину. В любом случае, решение было обновить с помощью следующего кода:

grid.setFilter(grid.getFilter());

Это странно и странно, но если ничего не помогает...

С этим я могу обновить конкретную строку. Этот пример для дерева.

var idx = this.treeGrid.getItemIndex(item);
                                    if(typeof idx == "string"){
                                        this.treeGrid.updateRow(idx.split('/')[0]);
                                    }else if(idx > -1){
                                        this.treeGrid.updateRow(idx);
                                    }   
Другие вопросы по тегам