Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Колонка таблицы не показывает данные из связанной моделе (https://javascript.ru/forum/extjs/56350-kolonka-tablicy-ne-pokazyvaet-dannye-iz-svyazannojj-modele.html)

Пролетарий 11.06.2015 15:11

Колонка таблицы не показывает данные из связанной моделе
 
Всем привет.

Есть таблица, которая связана с viewModel и в ней есть одна колонка, в которой находятся данные, связанные через reference, но в этой колонке ничего не показывается. Такое впечатление, что для таблицы данные в эту колонку не подгружаются.

Забиндил вот так:
viewModel: {
        type: 'order'
    },
    bind: {
        store: '{orders}'
    },

Все колонки выводятся как надо, кроме той где reference.

Вот сама колонка:
{
            text: 'Стратегия',
            dataIndex: 'strategy',
            renderer: function(value) {
                if ((value === undefined) || (value === null)) {
                    return '';
                };
                return value['name']; 
            }
        },


Вот так выглядит поле в моделе, связанной с колонкой:
{name: 'strategy', reference: 'StrategyModel'},


Данные с сервера поступают и я могу их видеть по ссылке. Так же если открываю данные из строки таблицы в форме для редактирования, то поле там заполнено, оно у меня в виде комбобокса.

Что интересно, когда открываю форму для редактирования, то данные в колонке с reference появляются как надо. Т.е. при открытии формы всё подгружается или ещё что-то делается и таблица для конкретной строки это видит, а вот сама для всех строк в эту колонку ничего не выводит.

Что и куда надо добавить, чтобы поле с reference начало показывать, ну или наверное точнее, загружать в колонку данные?

siber-biber 11.06.2015 16:00

вставьте debugger в renderer и поглядите в отладчике что приходит в arguments и почему так получается:
{
            text: 'Стратегия',
            dataIndex: 'strategy',
            renderer: function(value) {
                debugger

                if ((value === undefined) || (value === null)) {
                    return '';
                };
                return value['name']; 
            }
        },

Пролетарий 11.06.2015 16:12

Ох, какая вещь хорошая, не знал о таком. Получше чем лог консоли. Спасибо.

Показывает value = undefined для всех строк, ну а когда открываю форму для редактирования, то соответственно, типа, value = Object {id: 82, name: "Новая стратегия", description: "Её описание"}

Я из-за этого undefined и думаю, что просто не грузится другая модель на которое поле модели таблицы ссылается. Но что с этим делать не знаю, думаю есть какая-то опция в настройках, но где и какая мне неизвестно и примеры пока не нашел.

Цитата:

Сообщение от siber-biber (Сообщение 374754)
вставьте debugger в renderer и поглядите в отладчике что приходит в arguments и почему так получается:
{
            text: 'Стратегия',
            dataIndex: 'strategy',
            renderer: function(value) {
                debugger

                if ((value === undefined) || (value === null)) {
                    return '';
                };
                return value['name']; 
            }
        },


Пролетарий 11.06.2015 17:09

Вложений: 1
В аргументе record рендера присутствуют данные строки, но моя колонка как-то странно там показана. Т.е. в data где все поля перечислены с их значениями, моей проблемной колонки нету, но зато она есть отдельным параметром, при том с подчеркиванием, которое я нигде не ставил. Прикладываю картинку, чтобы понятней было.

Чтобы это могло означать? Что надо сделать, чтобы это всё вставить в общие данные, ну или как правильно получить доступ полю. Ну по крайней мере стало ясно, что данные грузятся в таблицу, вот только не среди прочих, а почему-то отдельно.

Пролетарий 11.06.2015 17:18

Переписал рендер вот так:
{
            text: 'Стратегия',
            dataIndex: 'strategy',
            renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
                return record._strategy.data.name;
            }
        },


Но что-то мне подсказывает, что это не правильно, что не зря они замаскировали мое поле подчеркиванием. Возможно от такого способа как я сейчас сделал возникнут сбои или ещё какие проблемы?

Пролетарий 11.06.2015 17:28

Ну да, не правильно как и подумал. Ошибку и предупреждение пишет:

[W] XTemplate evaluation exception: Cannot read property 'data' of null.

Uncaught TypeError: Cannot read property 'childNodes' of null

siber-biber 11.06.2015 19:02

есть вот такой метод: http://docs.sencha.com/extjs/5.1/5.1...AssociatedData
а вообще на модели должен быть сгенерирован метод strategies который вернет Ext.data.Store со связанными записями:
renderer : function (value, metaData, record) {
    var strategy = record.strategies().getAt(0);
    return strategy && strategy.get('name');
}

Пролетарий 11.06.2015 19:26

Тут похоже вообще много волшебства, не зная о котором можно два дня безуспешно долбиться об стену как я в данном случае.

Нашел всё же пример с подобной вещью как у меня и был буквально потрясен, что в тихушку творит ExtJS. Оказывается для каждой строки таблицы, для каждой колонки с данными из reference автоматически создаются функции из get+Название поля из модели. В моем случае это оказалась getStrategy().

Я нашел рендера в примере, где он вызывал подобную функцию и я пытался её найти во всех файлах примера и не мог. Функция есть, а реализации её нет! Потом решил посмотреть подобное у себя в реальном времени и был удивлен, найдя её. :)

Ну вот спрашивается, как я должен был об этом догадаться? Когда решил остановиться на ExtJS, то читал о том что кривая обучения очень крутая, но думал просто пугают, но теперь вижу что были правы.

В общем сделал так, и пока работает:
renderer: function(value, metaData, record) {
                if (record.getStrategy() !== null) {
                    return record.getStrategy().get('name');
                };
            }


Похоже можно и как у вас сделать и как в примере.


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