Вход

Просмотр полной версии : Вызов record.save() не обновляет pagingtoolbar и не меняет фантомный id на реальный


khusamov
14.06.2015, 18:05
Здравствуйте!

Вот кусок кода:

if (form.isValid()) {
form.updateRecord();
if (form.getRecord().phantom) {
// insert
Ext.Msg.wait("Данные добавляются! Подождите...", "Добавление");
form.getRecord().save({
scope: me,
success: "onInsertSuccess",
failure: "onInsertFailure"
});
} else {
// update
var store = me.getStore();
if (form.isDirty()) {
Ext.Msg.wait("Данные обновляются! Подождите...", "Обновление");
store.sync({
scope: me,
success: me.onUpdateSuccess,
failure: me.onUpdateFailure
});
} else {
me.getView().close();
}
}
},

onInsertSuccess: function(record) {
var me = this;
me.getStore().add(record);
Ext.Msg.hide();
me.getView().close();
// ЗДЕСЬ ПРОБЛЕМЫ: pagingtoolbar не обновляется, в гриде id равен фантомному, хотя сервер вернул реальный
}

Почему после вызова form.getRecord().save() pagingtoolbar не обновляется, а в гриде id равен фантомному, хотя сервер вернул реальный?

khusamov
14.06.2015, 18:30
С удалением записей такие же проблемы. Пэйджер не обновляется. Надпись в grid-е о том, что записей нет - не появляется.

bastrakov
15.06.2015, 10:08
перечитайте грид, делов-то. :-)

siber-biber
15.06.2015, 11:27
ну зашибись изза одной записи всё перерисовывать.. так не должно быть просто в коде чтото не то.
нужен тест кейс

bastrakov
16.06.2015, 12:40
гм... правильно ли я понял, что действия других пользователей нас не интересуют?
я к тому, что чем реже перечитывать грид (особенно с пейджингом), тем больше вероятность видеть неверные данные. а тут как бы и случай подходящий.

novikov
16.06.2015, 13:06
Сохранение записи record.save (http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/source/Model2.html#Ext-data-Model-method-save)() не связано с обновлением хранилища, подложенного под грид, несмотря на то, что эта запись относится к этому хранилищу.

Думаю, чтобы синхронизация затронула хранилище грида, нужно вначале получить его через record.store (http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/#!/api/Ext.data.Model-property-store), а затем выполнить sync().

Либо попробовать record.commit(false) (http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/#!/api/Ext.data.Model-method-commit).

Из моего арсенала:


onNewSubmitted: function(record) {

record.save({
success: function() {
var view = this.getView();
var companyGrid = view.down('companyGrid');

var store = Ext.StoreManager.lookup('companyStore');
store.add(record);

companyGrid.getSelectionModel().select(record);

},
scope: this
});

},

onNewCanseled: function() {

var view = this.getView();
var cardContainer = view.down('#cardContainer');
var companyNew = view.down('companyNew');

var record = companyNew.getRecord();
record.erase();
companyNew.reset(true);

cardContainer.hide();

},

onDeleteRequested: function(record) {

var view = this.getView();
var cardContainer = view.down('#cardContainer');
var companyForm = view.down('companyForm');
var companyDisplay = view.down('companyDisplay');

if (record.phantom) {
cardContainer.hide();
companyForm.reset(true);
companyDisplay.reset(true);
return;
}

Ext.Msg.show({
title:'Удаление',
message: 'Действительно удалить запись?',
buttons: Ext.Msg.YESNO,
buttonText: {
yes: 'Да',
no: 'Нет'
},
icon: Ext.Msg.QUESTION,
fn: function(btn) {
if (btn === 'yes') {
//var store = Ext.StoreManager.lookup('companyStore');
record.erase();
}
}
});

},