Как перенести таблицу фильтрации dojo (dojo 0.x) в DataGrid в (dojo 1.6)? - PullRequest
1 голос
/ 02 мая 2011

Я выполняю миграцию и расширение существующего веб-приложения на основе очень старой Dojo Framework.

Декларативная настройка таблицы:

OLD

<table dojoType="FilteringTable" id="dataTable" 
valueField="f_id" multiple="false" alternateRows="true">
  <thead><tr>
    <th field="f_fname">Firstname</th>
    <th field="f_lname">Lastname</th>
  </tr></thead>
</table>

NEW

<table dojoType="dojox.grid.DataGrid" id="dataTable">
  <thead><tr>
    <th field="f_fname">Firstname</th>
    <th field="f_lname">Lastname</th>
  </tr></thead>
</table>

Хранилище таблицы инициализации:

OLD

var tab = dojo.widget.byId("dataTable");
if(tab){
  tab.store.setData([]);
}

NEW

var tab = dijit.byId("dataTable");
if(tab){
  if(!tab.store){
    tab.store = new dojo.store.Memory({data:[]});
  }
  else{
    tab.store.setData([]);
  }
}

Обновление данных:

СТАРЫЙ / НОВЫЙ

tab.store.setData(result.array);

Старая версия таблицы заполнена данными, а новая версия таблицы остается пустой.Массив данных, полученный в обоих случаях, абсолютно одинаков.

Поэтому мне интересно, какие различия следует учитывать между хранилищем, используемым в старой FilteringTable, и API хранилища, используемым для новой dojox DataGrid.

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

Визуально новая таблица выглядит полностью функциональной.

обновление

tab.update(); // tab = dojox.grid.DataGrid

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

На самом деле DataGrid, похоже, вообще не реагирует на изменения в хранилище памяти.Может быть, здесь не хватает проводки?

обновление

Я проводил сетку с хранилищем памяти декларативно:

<div dojoType="dojo.store.Memory" jsId="memStore"></div>
<table dojoType="dojox.grid.DataGrid" id="dataTable" store="memStore">
  <thead><tr>
    <th field="f_fname">Firstname</th>
    <th field="f_lname">Lastname</th>
  </tr></thead>
</table>

СначалаЯ получаю сообщение об ошибке в _setStore () в DataGrid.js, говорящее:

this.store.getFeatures is not a function

.Возможно ли, что DataGrid не совместим со всеми магазинами?У меня сложилось впечатление, что API-интерфейс хранилища был стандартизирован в 1.6.

Если да, есть ли альтернативное хранилище для использования с вводом массива javascript.(как видно выше)

1 Ответ

4 голосов
/ 04 мая 2011

Дружеский постер на другом форуме (Миллениум) дал мне ответ:

Начиная с Dojo 1.6, в Dojo появилась новая схема доступа к магазинам.

Поскольку dojox.grid.DataGrid не поддерживает эти хранилища напрямую, в dojo.data предусмотрен класс-оболочка, называемый dojo.data.ObjectStore.

Таким образом, чтобы заставить работать мой магазин памяти, его нужно инициализировать с помощью:

var tab = dijit.byId("dataTable");
if(tab){
  if(!tab.store || !tab.store.objectStore){
    tab.store = new dojo.data.ObjectStore({
                    objectStore : new dojo.store.Memory({data:[]})
                });
  }
  else{
    tab.store.objectStore.setData([]);
  }
}

и дополнено:

tab.store.objectStore.setData(result.array);

Однако на данный момент есть еще небольшой недостаток: Сетка не обновляет свои данные автоматически, а только после сортировки столбца. Использование tab.update () не работает.

обновление

При изменении данных с помощью objectStore.put () или objectStore.setData () теперь я использую функцию _refresh () Grid. Хотя это частная функция, у меня до сих пор нет лучшего способа обновить Grid.

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