Проблемы получения значений при открытии окна редактирования записи
Добрый день.
По нажатию на кнопку грида "Редактировать" не удается открыть форму для редактирования выбранной записи. Сама форма появляется, но значения полей пустые. Грид: var textField = { xtype: 'textfield' }; Ext.define('BookApp.view.BookList' ,{ extend: 'Ext.grid.Panel', alias: 'widget.booklist', title: 'Library', store: 'BookStore', tbar: [{ text: 'Добавить операцию', iconCls: 'fa-plus', //handler: 'onAddClick', action: 'onAdd' },{ text: 'Редактировать', iconCls: 'fa-plus', //handler: 'onEditClick', action: 'onEdit' }, .... Контроллер: Ext.define('BookApp.controller.Books', { extend: 'Ext.app.Controller', views: ['BookList', 'Book', 'DoubleBookList'],// stores: ['BookStore','DoubleBookStore'],// models: ['Book', 'DoubleBook'], init: function() { this.control({ //Нажатие на кнопку редактирования 'booklist button[action=onEdit]': { click: this.editBook }, }); },//Открытие окна редактирования записи editBook: function(grid, record){ var me = this, win = Ext.widget('bookwindow'); console.log(record.data); win.down('form').loadRecord(record); }, clearForm: function(grid, record) { var view = Ext.widget('bookwindow'); view.down('form').getForm().reset(); } }); В контроллере при клике button[action=onEdit] вызываю функцию onEdit. В самой функции record.data у меня выводит 'undefined' . Понимаю что проблема заключается в использовании метода 'click' который не передает значения выбранной записи. Если переделать на событие itemdbclick для строки, то значения успешно передаются, но мне не подходит двойное нажатие на запись. Необходимо сделать редактирование записи именно через окно. Подскажите, какое событие необходимо использовать что бы значения полей передавались в форму редактирования или если кто может, поделитесь полезным примером. Спасибо |
Пожалуйста, используйте фидл. Будет гораздо проще выявлять проблемы. По вашему коду могу сказать пару замечаний:
1. 2. Вы неправильно предполагаете что в хендлер придет грид и рекорд. Вы получите кнопку, и надо будет найти грид, а из него - выбранную строку. |
Да, насчет первого пункта. Я заметил что вы используете Controller, а не ViewController. Возможно выбор метода control связан с этим? В любом случае я бы перешел на вьюконтроллеры если есть возможность, Сенча так и рекомендует.
|
Сделал так:
Ext.define('BookApp.view.BookList' ,{ extend: 'Ext.grid.Panel', alias: 'widget.booklist', title: 'Library', store: 'BookStore', tbar: [{ text: 'Добавить', iconCls: 'fa-plus', handler: function() { onAdd(this.up('booklist')); } },{ text: 'Редактировать', iconCls: 'fa-plus', handler: function() { onEdit(this.up('booklist')); } } ..... }); function onEdit(theGrid) { if (theGrid.getSelectionModel().hasSelection()) { var record = theGrid.getSelectionModel().getSelection(); var me = theGrid, win = Ext.widget('bookwindowedit'); win.down('form').loadRecord(record[0]); } else { alert('Необходимо выбрать запись для редактирования!'); } } Работает, но насколько так правильно делать? |
На мой взгляд, правильнее делать onEdit методом класса BookList. Если же он вызывается из нескольких классов, назовите более понятно, например editBook. Как правило хорошего тона, сделайте свой метод для запуска редактора вместо "win.down('form').loadRecord(record[0])". Например замените на "win.editBook(record)". Еще можно научить редактор понимать конфиги и задавать модели прямо там:
Ext.widget('bookwindowedit',{ record: bookRecord }) В целом, правильная архитектура определяется потребностями. Что делать методом чего и как вызывать - решать только вам. |
Часовой пояс GMT +3, время: 17:57. |