Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Зацикливание при использовании this.getStore().load() (https://javascript.ru/forum/extjs/75373-zaciklivanie-pri-ispolzovanii-getstore-load.html)

Ambassador 30.09.2018 20:30

Зацикливание при использовании this.getStore().load()
 
Приветствую.
Ребят, подскажите почему происходит зацикливание когда использую в рендере this.getStore().load() ?
А так же почему каждое значение index_record у меня -1, при том что я точно уверен что store_ca содержит запись с id == 1
...
{
        xtype: 'gridcolumn',
        text: 'Контрагент',
        dataIndex: 'contragent',
        editor: {
                xtype: 'combobox',
                allowBlank: false,
                displayField: 'name',
                valueField: 'id',
                queryMode: 'remote',
                store: Ext.data.StoreManager.lookup('ContrAgents')
                },
        renderer: function(value, metaData, record, rowIndex, colIndex, store, view){                
                if(this.getStore().load()){
                    store_ca = Ext.data.StoreManager.lookup('ContrAgents');
                    index_record = store_ca.findExact('id', 1);

                }
                if(index_record != -1){
                    rs = store_ca.getAt(index_record).data;
                    return rs.name;
                }
            }
        },
...

Заранее спасибо

siber-biber 02.10.2018 09:31

а что есть this.getStore() в renderer? если это стор который показывает грид ..то какбы всё очевидно грид пытается показать запись -> мы перезагружаем его стор -> грид пытается показать запись -> мы перезагружаем его стор -> ...

Ambassador 02.10.2018 15:45

Поясните, пож-та, в this.getStore() будет находиться тот стор который я указываю при определении класса:
store: 'BookStore'
?


Ext.define('BookApp.view.BookList' ,{
    extend: 'Ext.grid.Panel',
    alias: 'widget.booklist',
    itemId: 'BookList',
    title: 'Операции',
    store: 'BookStore',
...
 initComponent: function() {
        this.columns = [
        {
        xtype: 'gridcolumn',
        text: 'Контрагент',
        dataIndex: 'contragent',
        editor: {
                xtype: 'combobox',
                allowBlank: false,
                displayField: 'name',
                valueField: 'id',
                queryMode: 'remote',
                store: Ext.data.StoreManager.lookup('ContrAgents')
                },
        renderer: function(value, metaData, record, rowIndex, colIndex, store, view){                
                if(this.getStore().load()){
                    store_ca = Ext.data.StoreManager.lookup('ContrAgents');
                    index_record = store_ca.findExact('id', 1);

                }
                if(index_record != -1){
                    rs = store_ca.getAt(index_record).data;
                    return rs.name;
                }
            }
        },
....


Если так, то как корректно получить стор и проверить что он загружен?

siber-biber 02.10.2018 20:27

вы не проверяете загружен ли стор вы его загружаете: https://docs.sencha.com/extjs/6.5.3/...ml#method-load

для проверки есть метод: https://docs.sencha.com/extjs/6.5.3/...ethod-isLoaded

но этого в любом случае в renderer-е делать не надо. renderer вызывается на каждую запись из стора. и если уж он вызвался значит как минимум одна запись в сторе есть и он пытается её отрисовать для колонки.

Ambassador 15.10.2018 19:23

Здравствуйте.
В renderer я загружаю стор с функцией обратного вызова и в ней переменная contr только с последним значением записи стора ContrAgents.

{
            xtype: 'gridcolumn',
            text: 'Контрагент',
            dataIndex: 'contragent',
            editor: {
                xtype: 'combobox',
                allowBlank: false,
                displayField:'name',
                valueField:'id',
                queryMode:'remote',
                store: Ext.data.StoreManager.lookup('ContrAgents')

            },
            renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
			    store_ca = Ext.data.StoreManager.get('ContrAgents'); 			
			    //console.log(store_ca)
			    if (record.data.contragent != ''){
			        var datafield = store_ca.load(function(records, operation, success) {
			            var contr = store_ca.getById(record.data.contragent);
			            indexInStore = store_ca.findExact('id', value);			            
			           console.log(contr);
			        });
			        
			
			    }
			}

        }

Как правильно вернуть 'name' установленных записей?
Для наглядности создал пример со своей проблемой в fiddle

siber-biber 15.10.2018 21:28

я все еще не понимаю зачем при показе каждой записи этого грида делать перезагрузку одного и того же стора store_ca

если это у вас справочник контрагентов почему вы его просто не загружаете 1 раз?

https://fiddle.sencha.com/#view/editor&fiddle/2mlc

Ambassador 25.10.2018 11:28

Цитата:

Сообщение от siber-biber (Сообщение 496428)
я все еще не понимаю зачем при показе каждой записи этого грида делать перезагрузку одного и того же стора store_ca

если это у вас справочник контрагентов почему вы его просто не загружаете 1 раз?

https://fiddle.sencha.com/#view/editor&fiddle/2mlc

Взял за основу не правильный пример.
Спасибо большое за помощь, вы мне очень помогли!


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