XAPuTOH, Сделал по примеру того как Вы написали. Вот код на редактирование:
onEdit: function(view, cell, rowIndex, colIndex, e, rec, row) { console.log(rec); var form = new MyApp.view.dictionaries.positions.PositionsForm({ viewModel: { data: { title: 'Редактирование' } } }); console.log(form); form.loadRecord(rec); form.show(); }, Форма показывается, заполняется и даже отправляется куда надо, но при этом если мы жмем "Сохранить" без редактирования, то в request'е уходит лишь id! Т е получается у нас значения уходят на сервер лишь при изменении. Как Вы этот момент отлавливаете? Еще почему-то у меня два PUT'а на сервер уходят вместо 1го...я так понимаю, что тут проблема в том, что после updateRecord идет сразу record.save и получается 2 одинаковых действия. Если мы убираем record.save, то уже нет проблемы отправки пустой записи и форма просто закрывается на "Сохранить". Можете также выложить ф-цию `this.formSave`и объяснить момент со вставкой? :thanks: p.s. Этот код не сработает никогда: } else { Ext.Msg.alert('Некорректные данные', 'Введите корректные данные'); } Потому что в форме прописано на кнопке "Сохранить" вот это: formBind: true, disabled: true, У пользователя нет никакой возможности нажать на кнопку, которая отключена =) |
В общем, унифицированной универсальной формы не получилось. Получилось некое её подобие. :-?
Дело в том, что мне вставка новой записи нужна именно через Store, иначе событие write, которое показывает всплывающие toast-сообщения, не отрабатывает. А к Store, который может быть любым, неизвестно каким образом вообще обращаться из этой формы. То, что `record.save()` не связано с обновлением хранилища писали еще тут: http://javascript.ru/forum/extjs/564...tml#post375259 Вот такая форма: Ext.define('MyApp.view.helpers.Baseform', { extend: 'Ext.form.Panel', xtype: 'baseform', controller: 'baseform', bind: { title: '{editformTitle}' }, layout: { type: 'vbox', align: 'stretch' }, bodyPadding: 10, border: false, width: 400, modal: true, closable: true, closeToolText: 'Закрыть', floating: true, reference: 'form', buttons: [ { formBind: true, disabled: true, text:'Сохранить', handler:'save' }, { text: 'Отменить', handler: function(){ this.up('form').close(); } } ] }); Ее контроллер. Тут я проверяю id на целое число. Если целое, то у нас редактирование, если нет, то это новая запись. Также я сам record передаю при вызове события: Ext.define('MyApp.view.helpers.BaseformController', { extend: 'Ext.app.ViewController', alias: 'controller.baseform', save: function() { var me = this, form = this.view, record = form.getRecord(); // console.log(record); if (form.isValid()) { var id = record.getId(); var values = form.getValues(); // console.log(values); //check if edit if (Ext.isNumber(id)) { record.beginEdit(); record.set(values); record.endEdit(); } else { record.set(values); form.fireEvent('insertNew', record); } form.close(); } } }); Обработчики добавления, редактирования и создания формы: onAdd: function() { console.log('onAdd'); var record = Ext.create('MyApp.model.dictionaries.positions.Positions'); console.log(record); this.createForm(record, true); }, onEdit: function(view, cell, rowIndex, colIndex, e, rec, row) { this.createForm(rec, false); }, createForm: function(record, stateNew) { // console.log(record); var form = new MyApp.view.dictionaries.positions.PositionsForm({ viewModel: { data: { editformTitle: stateNew ? 'Добавление' : 'Редактирование' } } }); // console.log(form); form.loadRecord(record); form.on('insertNew', this.formInsertNew, this); form.show(); }, А вот обработчик события вставки: formInsertNew: function(record) { console.log('NEW RECORD!!!!'); console.log(record); var store = this.getView().getStore(); store.insert(0, record); } Обновляю я store в событии `write`, там же вывожу toast-сообщение. Да, есть неудобный костыль с обращением к store, но пока иного решения не нашел. Буду признателен, если кто-нибудь из форумчан даст ответы на эти вопросы:
|
Часовой пояс GMT +3, время: 17:23. |