Как программно создать dijit.Dialog с dojox.grid.DataGrid

У меня есть следующая проблема:

При программном создании dijit.Dialog и dojox.grid.DataGrid (связанных с глобальным хранилищем переменных данных (dojo.store.Memory)) содержимое диалогового окна не отображается, а размер диалогового окна остается минимальным.

Хранилище DataGrids заполнено правильно, и Firebug показывает сетку внутри диалогового окна.

data = new dojo.data.ObjectStore(
  { objectStore: new dojo.store.Memory({data:[]}) });

data.put({id:0,name:'Franklin'});

showDialog = function(){
  var dlg = dijit.byId('myDlg');
  if(dlg){
    dlg.show();
  }
  else{
    var cp = new dijit.layout.ContentPane({style:"width:500;height:500;"});
    var grid = new dojox.grid.DataGrid({
      store : data,
      structure : [
        {field:'id',name:'ID',width:'50px'},
        {field:'name',name:'Name',width:'400px'}]
    },cp);

    dlg = new dijit.Dialog({
      id:'myDlg',
      title:'Names',
      content:cp.domNode
    });

    grid.startup();
    dlg.show();
  }
);

Может я что-то не в том порядке добавил?

Также я не знаю, является ли мой способ комбинирования/добавления виджетов dojo с использованием свойства domNode правильным способом ведения дел.

Я не знаю, нужна ли ContentPane, которую я использую, для размещения сетки внутри диалогового окна. Оба варианта пока не работали.

Наконец, я не уверен, нужны ли и где Диалогу статические измерения для правильного размера. По моему опыту, самому диалоговому окну не нужна статическая ширина или высота, но у меня пока нет опыта добавления динамического компонента, такого как сетка, который может изменить свой размер позже при запуске, в диалоговое окно.


person elfwyn    schedule 16.05.2011    source источник


Ответы (2)


Вам не нужно сначала показывать диалог, это превосходит цель наличия диалога. Вам нужно создать сетку, добавить domNode в диалоговое окно, а затем показать диалоговое окно. Это работает для меня во всех моих кодах. Лучший

person David Zhao    schedule 28.09.2011

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

И диалоговое окно, и сетка нуждаются в явных размерах. Если в диалоговом окне есть другое содержимое, дополнительная информация о ширине может не потребоваться.

var myDialog = dijit.byId('myDialog');
if(!myDialog){
    myDialog = new dijit.Dialog({
        id:'myDialog',
        title:'test dialog',
        style:'width:600px;height:600px;'
    });
}
myDialog.show();

var myMemoryStore = new dojo.store.Memory(
    {data:[
        {'id':'0','lastname':'Frank'},
        {'id':'1','lastname':'Herbert'}]});
var myObjectStore = new dojo.data.ObjectStore({objectStore:myMemoryStore });

var myStructure = [
    {field:'id',       name:'ID',   width:'20px'},
    {field:'lastname', name:'NAME', width:'200px'}];

var myGrid = dijit.byId('myGrid');
if(!myGrid){
    myGrid= new dojox.grid.DataGrid({
        id:'myGrid',
        store:myObjectStore ,
        structure:myStructure,
        style:'width:400px;height:400px;'
    });
}

dojo.place(myGrid.domNode,myDialog.containerNode,'first');
myGrid.startup();
person elfwyn    schedule 18.05.2011
comment
Это решение сработало для меня, но, возвращаясь к этому вопросу, я вижу возможные лучшие решения, поэтому я снова открываю этот вопрос, чтобы проверить их. - person elfwyn; 01.11.2011
comment
Я сделал то же самое. проблема в том, что вы пытаетесь добавить в свой диалог больше, чем сетку. я смог найти обходной путь, но почему-то диалог не по центру. - person Nap; 11.01.2014
comment
@Nap У меня та же проблема, она не центрируется! Интересно, вы разобрались? - person Saky; 16.08.2017
comment
@ Саки нет, у меня все та же проблема. - person Nap; 18.08.2017