21.06.2015, 11:30
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Этот код выглядит странно. Много чего лишнего.
Ext.define('JournalApp.view.notes.Note', {
extend: 'Ext.grid.Panel', //'Ext.panel.Panel',//
noteStore: null,
initComponent: function() {
this.callParent();
this.noteStore = Ext.getStore('JournalApp.store.NoteStore');
this.on('render', this.loadStore, this);
},
loadStore: function() {
this.noteStore.load({
scope: this,
params: {
orderid: 'тут ид родителя таблицы, но как получить?'
}
});
},
Запись
noteStore: null,
не нужна, так как в гриде и так есть store. Незачем делать дубликат.
Запись
this.noteStore = Ext.getStore('JournalApp.store.NoteStore');
вообще не нужна. Все работает и без нее. Нужно store задавать как и полагается: store: {type: "алиас сторе"}
Запись
this.on('render', this.loadStore, this);
не нужна, можно просто store сделать autoload
Проблема " ид родителя таблицы, но как получить?" не решаемая, ибо не виден контекст использования этого кода. Нужна песочница. Сделай те пример.
Последний раз редактировалось khusamov, 21.06.2015 в 11:33.
|
|
21.06.2015, 11:33
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Цитата:
|
(У формы свой стор, у таблицы свой.)
|
Сделайте пример в песочнице. А то из этой фразы много чего вытекает.
|
|
21.06.2015, 12:21
|
Аспирант
|
|
Регистрация: 01.06.2015
Сообщений: 57
|
|
Сначала всё правильно, когда кликаем по "ордерам" в левой части, то открывается закладка "Ордера", где находится перечень всех ордеров в виде таблицы, но там только таблица с ордерами, таблица с "заметками", находится исключительно в самом ордере. Чтобы добраться до таблицы заметок, надо открыть ордер.
Каждая заметка принадлежит конкретному ордеру, поэтому при load() нужно знать ИД ордера, чтобы получить заметки для конкретного ордера, а не все что есть. Так же при редактировании.
Для таблицы "Заметки" я сделал отдельный store, потому что часто будет так что в самом ордере будут добавляться только заметки, а остальные поля не будет затронуты, соответственно нет необходимости из за одной строки, гонять на сервер все 20 полей, которые ещё будет добавлены. (На картинке только малая часть, что я пока добавил.) Мне кажется так правильней в моем случае и даже не думал что возникнут проблемы.
Получается, после открытия закладки с конкретным ордером, он будет сам по себе слать данные на сервер, не затрагивая заметки, ну и заметки то же будут сами по себе. И когда произойдет добавление строки в таблицу заметок, то ордер на сервер ничего не пошлет.
Как применять links я к сожалению не понял, поэтому чтобы передать данные в форму конкретного ордера, данные из строки таблицы "ордеров" сохраняются в переменную singleOrder и от туда форма заполняет свои поля. Я думал что links это что-то намертво прописанное в ViewModel, сделал вывод такой из примеров, где всегда прописаны конкретные данные. Надо пересмотреть это дело.
К сожалению, данные в таблицу заметок должны грузиться при открытии ордера. Т.е. открывается закладка конкретного ордера и таблица заметок заполняется, заметками для открываемого ордера.
Сообщение от novikov
|
Правильно ли я понимаю, что при клике по узлу "Ордера" в левом дереве в правой части появляется панель с одной закладкой, которая содержит таблицу со всеми ордерами, и под ней таблица со всеми заметками. Потом при клике на отдельный ордер в общем списке проявляется сбоку от него форма с данными ордера, а нижняя панель заметок фильтруется под выбранный ордер.
Если так, то после клика по строке ордера при создании нового экземпляра формы можно назначить ссылку на выбранную запись во ViewModel через links или linkTo.
У таблицы заметок есть своё хранилище. На мой взгляд, лучше найти этот компонет при помощи up() и down(), затем извлечь его хранилище через getStore() и выполнить фильтрацию filter(), указав в фильтре id выбранного ордера. Благо в обработчике события selectionchange, выполняющем всю эту логику есть информация о выбранной строке.
Поправьте, если я чего недопонял в задаче.
|
|
|
21.06.2015, 12:41
|
Аспирант
|
|
Регистрация: 01.06.2015
Сообщений: 57
|
|
Сообщение от khusamov
|
Этот код выглядит странно. Много чего лишнего.
|
Возможно, мне сложно судить, но это единственное что заработало, более простые и очевидные способы не работали.
Сообщение от khusamov
|
Запись
noteStore: null,
не нужна, так как в гриде и так есть store. Незачем делать дубликат.
|
А как его получить? Через this.getStore() я получаю стор, но когда вызываю load() то получаю ошибку. А через эту дополнительную переменную всё работает.
Сообщение от khusamov
|
Запись
this.noteStore = Ext.getStore('JournalApp.store.NoteStore');
вообще не нужна. Все работает и без нее. Нужно store задавать как и полагается: store: {type: "алиас сторе"}
|
Я так делаю, если это имеется ввиду, но как я выше написал получаю ошибку. А через это глобальное получение Ext.getStore() по крайней мере в переменной оно есть.
{
xtype: 'noteGrid',
fieldLabel: 'Заметки:',
viewModel: {
type: 'order'
},
bind: {
store: '{notes}'
},
}
Сообщение от khusamov
|
Запись
this.on('render', this.loadStore, this);
не нужна, можно просто store сделать autoload
|
К сожалению от autoload пришлось отказаться, т.к. заметки должны быть получены для конкретного ордера, при открытии этого ордера. А для этого надо знать ИД ордера перед load().
Я когда задумал это дело, то рассчитывал, что при открытии формы, в которую вложена таблица заметок, то при её создании я передам в store фильтр с ИД ордера и затем произойдет autoload и всё будет как в сказке. Но в реальности autoload вызывается при открытии приложения, само собой без нужного ИД, а при открытии формы, где находится таблицы, которую надо загрузить, никакого autoload не происходит. Поэтому весь этот код в initComponent.
|
|
21.06.2015, 13:34
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Цитата:
|
А как его получить? Через this.getStore() я получаю стор, но когда вызываю load() то получаю ошибку. А через эту дополнительную переменную всё работает.
|
Если делать все правильно, то вызов getStore() не понадобиться.
Этот код:
{
xtype: 'noteGrid',
fieldLabel: 'Заметки:',
viewModel: {
type: 'order'
},
bind: {
store: '{notes}'
},
}
нужно переписать так:
{
xtype: 'noteGrid',
fieldLabel: 'Заметки:',
viewModel: {
type: 'order',
stores: { notes: { type: "notes" } }
},
bind: {
store: '{notes}'
},
}
Причем до этого должен быть загружен сторе с алиасом "store.notes" (внимание!!!, нужно загружать сам КЛАСС сторе, например достаточно в приложении его прописать в stores или просто через require подгрузить класс).
Цитата:
|
К сожалению от autoload пришлось отказаться, т.к. заметки должны быть получены для конкретного ордера, при открытии этого ордера. А для этого надо знать ИД ордера перед load().
|
Автолоад нужен, но грид заметок должен создаваться ПОСЛЕ выбора ордера. После закрытия вкладки ордера грид должен уничтожаться (destroy). Тогда все встанет на свои места. Тогда и автолоад заработает как нужно. Такой вариант во многих примерах сенчи расписан. То есть щелкнули по ордеру - вкладка и грид в ней и вообще все создается на лету, а при закрытии вкладки - все уничтожается.
Последний раз редактировалось khusamov, 21.06.2015 в 13:38.
|
|
21.06.2015, 13:36
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Цитата:
|
Я когда задумал это дело, то рассчитывал, что при открытии формы, в которую вложена таблица заметок, то при её создании я передам в store фильтр с ИД ордера и затем произойдет autoload и всё будет как в сказке. Но в реальности autoload вызывается при открытии приложения, само собой без нужного ИД, а при открытии формы, где находится таблицы, которую надо загрузить, никакого autoload не происходит. Поэтому весь этот код в initComponent.
|
Еще раз:
1) открытие формы нужно поменять на СОЗДАНИЕ формы и создание всего что в ней
2) автолоад нужен
3) сторе нужно подключать через алиасы, тогда автолоад будет работать не при создании приложения, а при создании формы (аля создании сторе)
|
|
21.06.2015, 13:39
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
для лучшего понимания создайте код в песочнице
|
|
21.06.2015, 13:48
|
Аспирант
|
|
Регистрация: 01.06.2015
Сообщений: 57
|
|
Пытаюсь, но там не меньше сложностей чем в реальном проекте. Уже не один раз пробовал, но пробиться через кучу ошибок не могу. Вот для данной проблемы пробую, но получаю ошибку, которая для меня мало информативна. Если не сложно гляньте, может поможете через проблемы песочницы пробраться, чтобы решить реальную.
https://fiddle.sencha.com/#fiddle/p53
Сообщение от khusamov
|
для лучшего понимания создайте код в песочнице
|
|
|
21.06.2015, 14:04
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
вот исправленный вариант https://fiddle.sencha.com/#fiddle/p55
Файл переименовал orders -> orders.json (точнее прописал URL прямо на вкладке открытого файла, ибо просто переименование почему-то у них не работает...)
Дописал прокси УРЛ:
Ext.define('Fiddle.model.OrderModel', {
extend: 'Fiddle.model.Base',
fields: [
'id', 'description'
],
proxy: { // дописал
url: "orders.json"
}
});
в классе Fiddle.view.Main дописал:
viewModel: {
type: 'order',
stores: { // дописал
orders: {
model: "Fiddle.model.OrderModel"
}
}
},
в классе Fiddle.view.Main расскомментировал:
store: '{orders}'
Последний раз редактировалось khusamov, 21.06.2015 в 14:08.
|
|
21.06.2015, 14:05
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Цитата:
|
Пытаюсь, но там не меньше сложностей чем в реальном проекте.
|
у всех аналогичные проблемы...
но код надо делать маленький, чтобы локализовать ошибку
иначе очень сложно помогать... времени в обрез.
|
|
|
|