Extjs 4.0.7, Editor Grid - как получить обновленное значение ячейки?

Мне нужно получить (получить) обновленное значение ячейки в контроллере. (MVC)

Я попробовал это,

var modified = this.getItemGrid().getStore().getUpdatedRecords();
console.log(modified); // return [] empty array

var modified = this.getItemList_Store().getUpdatedRecords();
console.log(modified); // return [] empty array

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

кто-нибудь знает, что я делаю не так?

Вот моя часть кода,

Ext.define("App.view.orders.ItemList_view", {
    extend: "Ext.grid.Panel",
    alias: "widget.itemList_view",
    plugins: [
            Ext.create('Ext.grid.plugin.CellEditing', {
                clicksToEdit: 1
            })
    ],
    initComponent: function () {
        this.store = "ItemList_store";
        this.columns = [
            {
                xtype: 'checkcolumn', text: "Ship", width: 50, dataIndex: "DR"
            },
            { header: "test", width: 100, dataIndex: "test",
                editor: {
                    xtype : 'textfield'
                }
            }
        ];

        this.selModel = Ext.create("Ext.selection.CheckboxModel");
        //this.selModel = Ext.create("Ext.selection.CellModel"); // It does not works either.

        this.callParent(arguments);
    },
    .
    .
    .

Спасибо!

[РЕДАКТИРОВАТЬ]

Большое спасибо за ответ! У меня есть еще вопрос о сетке редактора.

Это сильно отличается от Ext3. так что я сейчас очень запутанный :(

Q1. How to collect edited record data (once click button)?

событие вызывается после изменения ячейки сетки. но я хочу собрать отредактированную запись сетки, как только я нажму кнопку "Обновить отредактированную ячейку"; кнопку, и я хочу обновить все вместе сразу.

В Ext3 мне это понравилось,

(button) click : function(){
    var modified = mygridStore.getModifiedRecords();

    var recordsToSend = [];
    Ext.each(modified, function(record){
        recordsToSend.push(record.data);
    });

    var grid = Ext.getCmp('grid');
    grid.el.mask('Updating','x-mask-loading');
    grid.stopEditing();

    recordsToSend = Ext.encode(recordsToSend);

    Ext.Ajax.request({
        url : '/test/test',
        params : {
            data : recordsToSend
        },
        success : function(response){
            grid.el.unmask();
            alert(response.responseText);
            mygridStore.commitChanges();
        },
        failure : function(response){
            mygridStore.rejectChanges();
        }
    });
}

Как я могу изменить код для Extjs4?

Q2. I don't know still how to find out for changed checkcolumn.

Я пробовал это, но я не работаю для checkcolumn (потому что я проверил после изменения checkbox)

// grid coumn
{
 xtype: 'checkcolumn', header: "My Check Column", width: 50, dataIndex: "CH"
}

-

// in control
'myGrid': {
    validateedit: function (plugin, edit) {
        console.log(edit);
    },
    checkchange: function (plugin, edit) {
        console.log(edit);
        console.log(edit.value);
    }
}

Q3. When I click the cell to edit, the show some HTML tag in -_-;;

enter image description here

I really appreciate for your help. and thank you very much for your valuable time!

 Geronimo26 июн. 2012 г., 23:38
Пожалуйста, смотрите изменения ниже.

Ответы на вопрос(3)

listeners: {
    validateedit: function (editor, e) {
        //console.log(editor);
    var oldVal = editor.originalValue;
    var newVal = editor.value;
    }
}
EditedGrid.plugins[0].completeEdit();

ирования.

Решение Вопроса

ения в хранилище, пока вы не завершите редактирование, что означает нажатиеENTER или размытие активного редактора ячеек, нажав в другом месте страницы или нажав кнопку «Сохранить» в форме редактора строк.

Если ваша цель для чтения обновленного значения в вашем редакторе - выполнить какую-то проверку, я бы посоветовал просто прослушатьvalidateedit событие в контроллере вашей сетки, как описаноВот.

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

Ext.define('MyApp.controller.MyController', {

    init: function() {

        this.control({

            'mygridpanel': {

                validateedit: function(plugin, edit) {

                    // silly validation function    
                    if (edit.value != 'A Valid Value') {
                        return false;
                    }
                },

            },

        });

    },

});

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

validateedit Событие запускается непосредственно перед тем, как запись фиксируется в хранилище - после того, как пользователь уже нажалENTER или размытие редактора, то есть, когда редактор закрывается.

Если вы пытаетесь получить значение заемщикаbefore он начинает закрываться, и по какой-то другой причине, кроме проверки, например, вы можете получить значение активного celleditor следующим образом:

// myGrid is a reference to your Ext.grid.Panel instance
if (myGrid.editingPlugin.editing) {
    var value = myGrid.editingPlugin.getActiveEditor().field.value

    console.log('value: ' + value);
}

Если нет активного редактора, тоmyGrid.editingPlugin.getActiveEditor().field выдает ошибку, поэтому я обернул ее условным выражением.

Еще один момент, который я должен сделать, для проверки в сетках редактора, я обнаружил, что проще всего просто поставитьvalidator Конфигурация в столбце сеткиeditor определение. Это даст вам весь удобный CSS для проверки, пока пользователь устанавливает значение поля, и предупреждает его, если существует проблема со значением, прежде чем он попытается его сохранить.

Чтобы понять, что я имею в виду, попробуйте ввести буквы в столбце датыэтот пример, Наведите курсор мыши на ячейку редактора, и вы получите сообщение об ошибке.

EDIT

Кажется, я неправильно понял ваш исходный вопрос, хотя я разберу свои ответы на ваши вопросы выше, хотя,

Question 1

После того, как вы завершили редактирование (нажалиENTER или), ваш звонокmygridStore.getModifiedRecords() должно работать нормально, потому что запись будет передана в магазин. Я вижу, что это не работает, я расскажу об этом чуть позже.

Я должен отметить, что ExtJS4 имеетstore.sync() метод как покрытоВот.

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

Если у вас есть разные URL-адреса для обработки различных операций создания, чтения, обновления и уничтожения, запускаемых вашим магазиномload а такжеsync методы, вы можете использовать прокси магазинаapi config, чтобы сопоставить ваши URL с этими операциями, как описаноВот, Или вы можете настроить свой контроллер на стороне сервера, чтобы иметь возможность различать ваш магазинload запрос (операции чтения по умолчанию для HTTP GET) и его запросы синхронизации (операции создания, обновления и удаления по умолчанию как HTTP POST).

Может быть много разных способов сделать это на стороне сервера, обычно я использую одну хранимую процедуру SQL для запросов GET и одну для запросов POST для любого данного хранилища. Я включаю имя хранилища в качестве дополнительного параметра, а затем мой серверный контроллер запускает соответствующую хранимую процедуру в зависимости от того, является ли это запросом GET или POST.

Question 2

Редактирование ячеек не поддерживаетcheckcolumn редактирует. Вы должны сделать другой обработчик для прослушивания изменений, например:

checkchange: function (column, rowIndex, checked) {
    var record = store.getAt(rowIndex),
        state = checked ? 'checked' : 'unchecked'

    console.log('The record:');
    console.log(record)
    console.log('Column: ' + column.dataIndex);
    console.log('was just ' + state)
}

Ваш звонок вmygridStore.getModifiedRecords() должен иметь возможность забирать изменения чека, однако они сразу же попадают в хранилище сетки после проверки.store.sync() также забрал бы изменения в checkcolumn.

Question 3

Я не могу полностью сказать, что является причиной этой проблемы, но это может быть что-то странное, что происходит с вашимvalidateedit событие, ваш обработчик должен возвращать true или false.

Как я уже говорил ранее, я неправильно понял причину, по которой вы изначально задали этот вопрос. Я думал, что вы пытаетесь сделать какую-то проверкуwhile редактирование было в процессе. Теперь я понимаю, что вы пытаетесь получить все измененные записи из хранилища после того, как все редактирование завершено, чтобы сохранить их в базе данных, я был сброшен, потому что в ExtJS 4 хранилище обычно сохраняется в базе данных сsync метод, как я уже говорил.

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

Реальная проблема, с которой вы сталкиваетесь, может быть связана с методами получения в магазине (getModifiedRecords, getUpdatedRecords) в некоторых версиях 4.07 посмотрите наэта почта а такжеэтот.

Итак, из всего сказанного, лучший совет, который я могу вам дать, это 1) попробовать магазиныsync метод для сохранения измененных данных в базу данных и 2) обновление до ExtJS 4.1, былоa lot из ошибок, которые были исправлены между 4.07 и 4.1, и вы должны были ими воспользоваться, я вырезал около 75% переопределений, которые я использовал, чтобы заставить вещи работать, когда я переключился на 4.1.

 Expert wanna be26 июн. 2012 г., 21:41
Спасибо за вашу помощь, но я все еще не могу решить мою проблему, не могли бы вы помочь мне немного больше, пожалуйста?

Ваш ответ на вопрос