Колонка таблицы не показывает данные из связанной моделе
Всем привет.
Есть таблица, которая связана с 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 начало показывать, ну или наверное точнее, загружать в колонку данные? |
вставьте debugger в renderer и поглядите в отладчике что приходит в arguments и почему так получается:
{ text: 'Стратегия', dataIndex: 'strategy', renderer: function(value) { debugger if ((value === undefined) || (value === null)) { return ''; }; return value['name']; } }, |
Ох, какая вещь хорошая, не знал о таком. Получше чем лог консоли. Спасибо.
Показывает value = undefined для всех строк, ну а когда открываю форму для редактирования, то соответственно, типа, value = Object {id: 82, name: "Новая стратегия", description: "Её описание"} Я из-за этого undefined и думаю, что просто не грузится другая модель на которое поле модели таблицы ссылается. Но что с этим делать не знаю, думаю есть какая-то опция в настройках, но где и какая мне неизвестно и примеры пока не нашел. Цитата:
|
Вложений: 1
В аргументе record рендера присутствуют данные строки, но моя колонка как-то странно там показана. Т.е. в data где все поля перечислены с их значениями, моей проблемной колонки нету, но зато она есть отдельным параметром, при том с подчеркиванием, которое я нигде не ставил. Прикладываю картинку, чтобы понятней было.
Чтобы это могло означать? Что надо сделать, чтобы это всё вставить в общие данные, ну или как правильно получить доступ полю. Ну по крайней мере стало ясно, что данные грузятся в таблицу, вот только не среди прочих, а почему-то отдельно. |
Переписал рендер вот так:
{ text: 'Стратегия', dataIndex: 'strategy', renderer: function(value, metaData, record, rowIndex, colIndex, store, view) { return record._strategy.data.name; } }, Но что-то мне подсказывает, что это не правильно, что не зря они замаскировали мое поле подчеркиванием. Возможно от такого способа как я сейчас сделал возникнут сбои или ещё какие проблемы? |
Ну да, не правильно как и подумал. Ошибку и предупреждение пишет:
[W] XTemplate evaluation exception: Cannot read property 'data' of null. Uncaught TypeError: Cannot read property 'childNodes' of null |
есть вот такой метод: 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'); } |
Тут похоже вообще много волшебства, не зная о котором можно два дня безуспешно долбиться об стену как я в данном случае.
Нашел всё же пример с подобной вещью как у меня и был буквально потрясен, что в тихушку творит ExtJS. Оказывается для каждой строки таблицы, для каждой колонки с данными из reference автоматически создаются функции из get+Название поля из модели. В моем случае это оказалась getStrategy(). Я нашел рендера в примере, где он вызывал подобную функцию и я пытался её найти во всех файлах примера и не мог. Функция есть, а реализации её нет! Потом решил посмотреть подобное у себя в реальном времени и был удивлен, найдя её. :) Ну вот спрашивается, как я должен был об этом догадаться? Когда решил остановиться на ExtJS, то читал о том что кривая обучения очень крутая, но думал просто пугают, но теперь вижу что были правы. В общем сделал так, и пока работает: renderer: function(value, metaData, record) { if (record.getStrategy() !== null) { return record.getStrategy().get('name'); }; } Похоже можно и как у вас сделать и как в примере. |
Часовой пояс GMT +3, время: 14:22. |