обновить DataGrid, когда JsonRestStore имеет новые данные

Додзё версии 1.7.2

У меня есть DataGrid, заполненный данными из MemoryStore. Он отлично работает, но данные в сетке не обновляются при обновлении объектов в магазине.

вот как связаны сетка и магазин:

formStore = Observable(new MemStore());
formGrid = new DataGrid( {
   store:ObjectStore( {objectStore:formStore} ),
   query:{id:"*"},
   structure:[
      { name:" ", field:"pending", width:"2em",
         formatter:function ( count, rowIdx, cell ) {
            return '<div style="font-size: smaller; text-align: right;">' + count + '</div>';
         }
      },
      { name:" ", field:"name", width:"auto",
         formatter:function ( formName, rowIdx, cell ) {
            return '<div style="white-space: nowrap;">' + formName + '</div>';
         }
      }
   ]

}, "formGrid" );

и у меня есть функция, которая обновляет данные в магазине:

function updateForms() {
   require( ["dojo/_base/xhr", "dojo/_base/array", "dojox/grid/DataSelection"],
               function ( xhr, array, DataSelection ) {
                  xhr.get( {
                     url:"services/jsonrest/form/",
                     content:{ id:"all" },
                     handleAs:"json",
                     load:function ( forms, io ) {
                        array.forEach( forms, function( form, idx ) {
                           formStore.notify(form, form.id);
                        });
                     }
                  } );
               } );
}

если хранилище пусто, когда эта функция запускается, элементы будут отображаться в DataGrid, но как только элементы находятся в сетке, они не обновляются. Это тестовая система, часть объекта Form меняется при каждом вызове.

В итоге я изменил метод на сервере, чтобы он постоянно возвращал все элементы, а затем функция javascript выглядит так:

function updateForms() {
   require( ["dojo/_base/xhr", "dojo/_base/array", "dojox/grid/DataSelection"],
               function ( xhr, array, DataSelection ) {
                  xhr.get( {
                     url:"services/jsonrest/form/",
                     content:{ id:"all" },
                     handleAs:"json",
                     load:function ( forms, io ) {
                        // reset all the items in the DataGrid
                        formGrid.setItems( forms );
                     }
                  } );
               } );
}

это тоже работает. Выбор сохраняется, а DataGrid не мерцает. но это как бы побеждает цель.

Я нашел эту статью, но не смог ее понять . Я пробовал много вещей, и ничего не получалось. В этой статье используется старый синтаксис dojo.connect вместо нового dojo.on.

Я уверен, что где-то не хватает какой-то детали.

Спасибо за помощь.


person Micha Roon    schedule 21.03.2012    source источник
comment
Вы пытались вызвать обновление в сетке? formGrid.обновить()   -  person Vijay Agrawal    schedule 21.03.2012
comment
по-видимому, formGrid.refresh() не является функцией. Я получаю сообщение об ошибке в FireBug.   -  person Micha Roon    schedule 22.03.2012
comment
он мог быть удален в более поздних версиях додзё. Теоретически то, что вы делаете, должно работать - единственное, что я могу предложить, - это сделать выборку и убедиться, что ваш магазин действительно обновлен.   -  person Vijay Agrawal    schedule 22.03.2012


Ответы (1)


В последней версии dojo был удален метод public refresh() DataGrid. Вы можете получить доступ к закрытому члену, используяformGrid._refresh().

Имейте в виду, что по какой-то причине они должны были удалить публичную функцию, и это противоречит философии OOPS.

В качестве общего совета, в обстоятельствах, когда невозможно найти другое решение, попробуйте ввести formGrid. в однострочном режиме консоли firebug. Когда вы вводите ., вы получаете список всех членов и свойств рассматриваемого объекта, включая все общедоступные (обычно без _ в начале) и все частные (обычно _ в начале).

Если это не работает в firebug, попробуйте отличную консоль в хроме.

person Gaurav Ramanan    schedule 10.05.2012