Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Несколько Grid-панелей на странице (https://javascript.ru/forum/extjs/37232-neskolko-grid-panelejj-na-stranice.html)

A.V. 12.04.2013 09:38

Несколько Grid-панелей на странице
 
Привет всем.
Пишу на ExtJS 4 (+ PHP, MySQL) систему управления данными. Основное - Grid-панель. Реализовал все CRUD-операции.
Проблема в следующем: когда добавляешь ещё одну Grid-панель (либо сбоку - в обычной панели, либо в одном из смежных tab'ов) CRUD-операции панель перестаёт корректно работать. Как я понял - это из-за того, что две или более Grid-панели на странице.
Искал в документации методы для обращения к выбранному хранилищу, ничего не нашёл. Гугл тоже ответов не даёт.
Прошу помощи: подскажите, можно ли решить проблему - реализовать CRUD-операции с несколькими панелями? Стоит ли вообще так делать? И если нет, то есть ли какая-либо альтернатива?

Приведу код контроллера:
Ext.define('SM.controller.Line', {
    extend: 'Ext.app.Controller',

    stores: ['Line'],

    models: ['Line'],

    views: ['line.Line', 'line.Grid'],

    refs: [{
            ref: 'linePanel',
            selector: 'panel'
        },{
            ref: 'lineGrid',
            selector: 'grid'
        }
    ],

    init: function() {
        this.control({
            'linegrid dataview': {
                itemdblclick: this.addLine
            },
            'linegrid button[action=add]': {
            	click: this.addLine
            },
            'linegrid button[action=delete]': {
                click: this.deleteLine
            },
            'lineform button[action=save]': {
                click: this.updateLine
            }
        });
    },

    addLine: function(grid, record) {
        var edit = Ext.create('SM.view.line.Line').show();

        if(record){
        	edit.down('form').loadRecord(record);
        }
    },
    
    updateLine: function(button) {
        var win    = button.up('window'),
            form   = win.down('form'),
            record = form.getRecord(),
            values = form.getValues();
        
        var novo = false;
        
		if (values.id > 0){
			record.set(values);
		} else{
			record = Ext.create('SM.model.Line');
			record.set(values);
			this.getLineStore().add(record);
            novo = true;
		}
        
		win.close();
        this.getLineStore().sync();

        if (novo){ 
            this.getLineStore().load();
        }
    },
    
    deleteLine: function(button) {
    	
    	var grid = this.getLineGrid(),
    	record = grid.getSelectionModel().getSelection(), 
        store = this.getLineStore();

	    store.remove(record);
	    this.getLineStore().sync();

        this.getLineStore().load();
    }
});


Кстати, обращение getStore('Line') аналогично ли getLineStore()?

Заранее спасибо за помощь.

P.S. только начинаю разбираться с ExtJS, многое не понимаю полностью, поэтому и спрашиваю совета.

skrudjmakdak 16.04.2013 11:17

как вы сказали: из за нескольких гридов.. скорей всего да, идет смешение.

я так понимаю это часть кода?? так сложно что то сказать..
попробуйте расставить логи (console.log(parameter); ). и смотрите что он выдает и что должно быть.. может найдете с какого места идет сбой

VKS 20.04.2013 21:09

У гридов один и тот же store?

alex_dutch 28.04.2013 01:46

Если один и тот же стор то проблемно.
Какие именно траблы, уточни?

Сам сейчас пытаюсь использовать один стор для закладок с гридами.

A.V. 07.05.2013 11:47

Спасибо всем за участие.

Дело было в том, что использовал Viewport. Из документации узнал, что Viewport может быть только один на странице.
А загвоздка возникала в том, что не работало удаление, несмотря на то, что store были разные, и при добавлении позиции не обновлялся список в grid.

То есть здесь
deleteNews: function(button) {
    	var grid = this.getLineGrid(),
    	    record = grid.getSelectionModel().getSelection(), 
          store = this.getLineStore();

	    store.remove(record);  
	    this.getLineStore().sync();

      this.getLineStore().load();
    }

не определяется из которого именно grid'а должна быть удалена позиция.

Искал в документации, но не нашёл способа обратиться к разным grid'ам, если на странице их несколько в одном Viewport'е.

Спасибо.

skrudjmakdak 08.05.2013 16:19

в гриде пишется id'шник и потом к нему можно обратится:
var grid = Ext.getCmp('idGrid');
также можно в массив список гридов запхнуть, если надо перебрать циклом..

A.V. 20.05.2013 09:22

skrudjmakdak,

спасибо за совет. Весьма полезен.


Часовой пояс GMT +3, время: 18:09.