ExtJS: добавлены строки сетки, которые не будут выделять - PullRequest
1 голос
/ 15 февраля 2011

При добавлении строк в сетку и последующем нажатии на нее она выделяется (и выделяется).Затем, щелкая в другом месте, но новая строка остается выделенной (так что теперь есть выделенные строки).

Пожалуйста, кто-нибудь знает, в чем может быть проблема?Как заставить его вести себя нормально, т. Е. Нажатие на строку отменяет выбор (отменяет выделение) другой?

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

Редактировать : Вот код для добавления строк:

var rec = new store.recordType({
    test: 'test'
});
store.add(rec);

Редактировать 2 : Кажется, проблема в listful: true.Если false, это работает!Но мне нужно, чтобы это было true, поэтому я смотрю на это дальше ... Похоже, что идентификаторы пошли как-то не так ... Если идентификатор изменился (сначала я создаю запись, а затем сервер возвращает правильныйID, это также может сбить с толку селектор строки, нет?)

Ответы [ 2 ]

0 голосов
/ 10 июня 2011

(обратите внимание, исправить как ExtJS 3.3.1)

Прежде всего, это мой быстрый и грязный хак.По совпадению мой CheckboxSelectionModel расширен в моей системе: -

Kore.ux.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.CheckboxSelectionModel, {

    clearSelections : function(fast){
        if(this.isLocked()){
            return;
        }
        if(fast !== true){
            var ds = this.grid.store,
                s = this.selections;
            s.each(function(r){
                //Hack, ds.indexOfId(r.id) is not correct.
                //Inherited problem from Store.reader.realize function
                this.deselectRow(ds.indexOf(r));
                //this.deselectRow(ds.indexOfId(r.id));
            }, this);
            s.clear();
        }else{
            this.selections.clear();
        }
        this.last = false;
    }
});

И это то место, где clearSelections терпит неудачу.Они пытаются отменить выбор строк, используя ds.indexOfId(r.id), и он вернет -1, потому что у нас нет определенного индекса remapped.

И вот почему мы не можем найти идентификатор: -

http://imageshack.us/photo/my-images/864/ssstore.gif/

Обратите внимание, что первый элемент на изображении неправильно "переназначен".Это связано с тем, что у нас есть проблема в функции «reMap» в нашей Ext.data.Store, которая читается следующим образом: -

// remap record ids in MixedCollection after records have been realized.  @see Store#onCreateRecords, @see DataReader#realize
reMap : function(record) {
    if (Ext.isArray(record)) {
        for (var i = 0, len = record.length; i < len; i++) {
            this.reMap(record[i]);
        }
    } else {
        delete this.data.map[record._phid];
        this.data.map[record.id] = record;
        var index = this.data.keys.indexOf(record._phid);
        this.data.keys.splice(index, 1, record.id);
        delete record._phid;
    }
}

По-видимому, этот метод не срабатывает (или не работает).Прослеженный далее, этот метод вызывается Ext.data.Store.onCreateRecords

....
this.reader.realize(rs, data);
this.reMap(rs);
....

Он выглядит хорошо с первого взгляда, но когда я отслеживаю rs и data, эти данные магически устанавливаются в неопределенные после this.reader.realize функция, и, следовательно, reMap не удалось сопоставить фантомную запись с нормальной записью.

Я не знаю, что не так с этой функцией, и я не знаю, как мне перезаписать этофункция в моем JsonReader. Если кто-то из вас окажется свободным, помогите нам отследить виновника, который вызывает эту проблему

Приветствия

Лайонел

0 голосов
/ 15 февраля 2011

Похоже, что для вашей сетки включена функция множественного выбора. Вы можете настроить модель выбора сетки, используя Ext.grid.RowSelectionModel.

Установите модель выбора на одиночный выбор, настроив sm (модель выбора) на панели сетки, как показано ниже:

sm: new Ext.grid.RowSelectionModel({singleSelect:true})

Обновление:

Попробуйте перезагрузить сетку, используя метод load или метод loadData хранилища сетки. Вы обновляете сетку на стороне клиента? тогда, возможно, вы можете использовать метод loadData. Если вы используете для получения данных из удаленного ... вы можете использовать метод загрузки. Я использую метод загрузки, чтобы обновить сетку новыми записями (после некоторых действий пользователя, таких как добавление, обновление и т. Д.). Или вы можете просто перезагрузить его следующим образом:

grid.getStore().reload();
...