2011-12-21 2 views
0

Heys Guys.CheckboxModel, предварительный выбор строк

У меня есть эта ошибка, которая уже несколько часов отключилась от меня. Мне удалось найти «почему», но мне нужна ваша помощь, чтобы найти «как это исправить».

Это форма для редактирования «сложной» записи.

Мой Макет (положить его просто) что-то вроде этого:

  • форма
    • tabpanel
      • panel1 (по умолчанию)
        • ...
        • ...
      • panel2
        • сетки

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

И моя проблема, потому сетки - или модели выбора - не имеет вид (по-видимому), он бросает «Не удается прочитать свойство„длина“неопределенной»

в

onSelectChange: function(record, isSelected, suppressEvent, commitFn) { 
    var me  = this, 
     views = me.views, 
     viewsLn = views.length, // HERE <------------- 
     store = me.store, 
     rowIdx = store.indexOf(record), 
     eventName = isSelected ? 'select' : 'deselect', 
     i = 0; 
... 

Если я вставляю SetTimeout достаточно большой, чтобы изменить вкладку, прежде чем он пытается выбрать строки, он работает нормально.

Итак, кто-нибудь знает, как это исправить?setTimeout подход не является вариантом, конечно :)

Большое спасибо.

ответ

0

Ну, проблема решена ... только что выбрали строки на afterrender Событие сетки.

Может помочь кому-то.

0

Я столкнулся с этой проблемой при добавлении смеси Ext.form.field.Field к Ext.grid.Panel, чтобы создать собственное поле формы формы GridMultiSelect. В частности, я обнаружил, что функция setValue() вызывается до того, как сетка была отображена, поэтому установка отказа не выполнена.

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

if (this.rendered) { 
    this.getSelectionModel().select(recordsToSelect); 
} else { 
    this.addListener('afterrender', function() { 
     this.getSelectionModel().select(recordsToSelect); 
    }, this, { 
     single: true 
    }); 
} 

То есть, если он еще не отображается, создать одноразовую слушателю для afterrender и затем выберите выделение.