Обновление gridx данными на стороне сервера

Я думаю, что упускаю из виду что-то простое - я так близок к тому, чтобы сделать эту работу. :)

У меня есть сетка, которую необходимо обновить информацией о сервере.

Вот как это должно работать:

  1. Пользователь выбирает элемент
  2. Сделайте запрос JsonRest с выбранным идентификатором элемента.
  3. Обновить сетку — показать примечания, относящиеся к выбранному элементу

Вот как устроена сетка:

функция noteTabSetup() {

var store = JsonRest({target:"//localhost/program/notes", idAttribute:"id"});

var structure = [{ field: 'id', name: 'Id', width: '5em' },
         { field: 'name', name: 'Name', width: '12%' },
         { field: 'description', name: 'Description' }];

var noteGrid = new Grid({
  id: 'noteGrid',
  pageSize: 20,
  store: store,
  cacheClass: Cache,
  structure: structure,
  filterServerMode: true,
  selectRowTriggerOnCell: true,
  bodyLoadingInfo: "Loading notes ...",
  bodyEmptyInfo: "No notes found",
  modules: [SingleSort, VirtualVScroller, moveColumn,
    selectColumn, dndColumn, selectRow, Filter]}, noteTab);

noteGrid.startup();

Когда элемент выбран, идентификатор выбранного элемента передается в:

function noteLoad(itemId) {
 console.log("In NoteLoad");
 var grid = registry.byId("noteGrid");

 if (!itemIds || 0 === itemIds.length) { console.log("no ItemId chosen"); }
 else {
  console.log("In NoteLoad with an itemId");

  grid.model.clearCache();

  // Error on second run
  grid.store.query({ find: "ByItem", item: itemId }).then(function(result) {
    grid.setStore(new ItemFileReadStore({data: {items : result}}));
  }); 

  grid.body.refresh();
  console.log("model: " + grid.rowCount());
 };
};

На первом выбранном элементе все работает хорошо — запрос срабатывает, и сетка обновляется заметками, относящимися к выбранному элементу. На втором выбранном элементе я получаю эту ошибку от firebug:

TypeError: grid.store.query is not a function
grid.store.query({ find: "ByItem", item: itemIds }).then(function(result) {
-----------------------------------^

Есть идеи?! Заранее спасибо. Крис


Спасибо за ответ - это имеет смысл, что хранилище было заменено на ItemFileReadStore. Если возможно, я хотел бы использовать JsonRest напрямую для обновления сетки.

Я безуспешно пробовал несколько вариантов, основанных на вашем комментарии:

Запрос срабатывает и возвращается результат. Сетка не обновляется:

grid.model.clearCache();
grid.store.query({ find: "ByItem", item: itemIds }).then(function(results){
  console.log('notes: ' + results[0].name);
});
grid.body.refresh();

Ошибка: grid.store.fetch не является функцией:

grid.store.fetch({ query: { find: "ByItem", item: itemIds }});

Синтаксическая ошибка в Dojo.js (строка 15):

grid.store.query({ find: "ByItem", item: itemIds }).then(function(result) {
  grid.setStore(new JsonRest({data: {items : result}}));
});

Я сделал много поисков и не могу найти хороший пример, когда сетка обновляется из объекта JsonRest. Спасибо.


person Chris Dowden    schedule 07.08.2014    source источник


Ответы (1)


Потому что сам код подменяет магазин с первого раза.

grid.store.query({ find: "ByItem", item: itemId }).then(function(result) {
  grid.setStore(new ItemFileReadStore({data: {items : result}}));
});

Здесь хранилище сетки изначально является хранилищем JsonRest, которое после выполнения метода запроса заменяется новым объектом ItemFileReadStore. Ошибка здесь в том, что «запрос» — это не метод ItemFileReadStore, а параметр, переданный методу «выборки». Ознакомьтесь с некоторыми примерами из документации dojo по этому вопросу.

С другой стороны, в хранилище JsonRest есть метод «запрос». Отсюда противоречие. Соответственно измените свой код, если хотите ItemFileReadStore.

eg:-

store.fetch( { query: { name: 'Ice cream' },  
               onItem: function(item) {
                  console.log( store.getValue( item, 'name' ) );
                  console.log( 'cost: ', store.getValue( item, 'cost' ) );
               }
});
person vivek_nk    schedule 08.08.2014
comment
Ах, попался. Я бы предпочел просто использовать JsonRest (а не ItemFileReadStore). Я пробовал варианты, но не могу обновить сетку. - person Chris Dowden; 12.08.2014