Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   initComponent: Как получить данные родителя и как получить store для вызова load()? (https://javascript.ru/forum/extjs/56516-initcomponent-kak-poluchit-dannye-roditelya-i-kak-poluchit-store-dlya-vyzova-load.html)

khusamov 21.06.2015 21:38

Еще кое что нужно.

Прокси описывайте в моделях, а не в хранилищах.

khusamov 21.06.2015 21:39

Цитата:

Можно конечно, насколько я понимаю сделать что-то вроде один ко многим и гонять заметки вместе с ордером, но у меня подобного таблице заметок будет ещё 3 штуки.

Получается ордер создается и заполняется. На этом всё. Больше он мало вероятно будет редактироваться, а вот заметки и ещё 3 подобные таблицы будут добавляться и редактироваться. Они будет состоять из 1-2 полей, а сам ордер из 20. Поэтому хочу сделать независимое обращение к сервера ордера и вложенных в него таблиц.
для данного пример я так понял это действительно не критично. Главное чтобы на сервер посылался запрос, в котором будет присутствовать номер Ордера, верно?
если да, то мы это в примере сделаем.

khusamov 21.06.2015 21:40

пока все
жду когда внесете эти правки и можно будет дальше работать.

khusamov 21.06.2015 21:45

Кстати, я совсем забыл. Вы этот пример http://dev.sencha.com/extjs/5.1.0/ex...app/index.html смотрели? Я как раз на нем научился программировать подобные задачки.

Рекомендую также посмотреть. В нем вы увидите как оформляются виды, чтобы в них потом не запутаться.

Пролетарий 21.06.2015 21:52

Цитата:

Сообщение от khusamov (Сообщение 375988)
1) У вас два вида: Таблица Ордеров и Просмотр Ордера

И для обоих видов вы используете одну и ту же модель вида: order

А по правильному нужно на каждый вид свою модель сделать.

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

Опять же когда два раза кликаю по строке таблице ордеров, то в форму просто передаю строку этой таблицы.

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

Цитата:

Сообщение от khusamov (Сообщение 375988)
2) Именования нужно привести в порядок. Я уже запарился открывать файлы - каждый раз приходится думать какой файл что хранит в себе.

С именование у меня проблемы. :) Всё не как не мог понять принятые в ExtJS правила. Когда большими буквами, когда маленькими, какие суффиксы и прочие использовать в названиях. Спасибо за разъяснение, буду упорядочивать.

khusamov 21.06.2015 21:58

Цитата:

Если создать модель для каждого вида, то они будут идентичны, с одними и теми же полями, поэтому сделал только одну модель, чтобы не дублировать код.
Неверно.

Модель вида ОРДЕРЫ будет содержать хранилище Ордеров

Модель вида ОРДЕР будет содержать хранилище Заметок этого ордера.

Уже БОЛЬШАЯ разница между этими двумя моделями.

Далее, в модели ОРДЕР будет поле singleOrder, которого в модели ОРДЕРЫ не будет. Оно там совершенно не нужно.

Так что вам что-то другое рекомендовали.

Модель вида для вида ЗАМЕТКИ скорее будет пустая, так как она будет пользоваться родительской. Но пока создайте пустую, а там видно будет - нужно ее удалить или нет.

khusamov 21.06.2015 22:00

Цитата:

С именование у меня проблемы. Всё не как не мог понять принятые в ExtJS правила. Когда большими буквами, когда маленькими, какие суффиксы и прочие использовать в названиях. Спасибо за разъяснение, буду упорядочивать.
Алиасы только строчными буквами.

Классы нужно так именовать:
ИмяПространства.путь.к.файлу.ИмяКласса


Алиас хранилища: store.алиас-хранилища

Имена файлов: ИмяКласса.js

Папки строчными.

Ну вроде пока все.

Пролетарий 21.06.2015 22:02

Цитата:

Сообщение от khusamov (Сообщение 375990)
Дальше, у вас один store определен. А их ведь два должно!

Сделайте два класса хранилища

Notes.js
Orders.js

и для каждого алиасы notes n orders соответственно

И после этого, в моделях видов можно прописывать {type:"алиас хранилища"}

Это отражения моего пути освоения ExtJS. :) Во всех примерах сторы записывают сразу в viewModel, а не в отдельном файле. Я стор для ордера сделал внутри viewModel, но затем где-то увидел, что можно все же определить стор в отдельном файле и через параметр source: 'путьКФайлуСтор'. Вот поэтому у меня один стор в файле, а другой сразу в viewModel.

Вообще я рефакторинг хотел на потом отложить, потому что чувствую, что придется всё по сто раз переделать, что уже не один раз делал. :(

Пролетарий 21.06.2015 22:04

Цитата:

Сообщение от khusamov (Сообщение 375992)
Когда вы это сделаете - вы значительно упростите свой код
станет проще в нем что либо искать при анализе
возможно ошибки все исчезнут сами собой - такое тоже иногда бывает

Тут я сильно сомневаюсь, у меня любое изменение приводит к очередным ошибкам, которые отнимают часы или дни. :) Я Golang освоил с пол пинка и проблем нет с устранением ошибок, а тут кошмар какой-то.

khusamov 21.06.2015 22:04

Цитата:

можно все же определить стор в отдельном файле и через параметр source: 'путьКФайлуСтор'.
Хранилища в отдельных файлах.
С алиасами.

В примере будет сразу все работать, а вот в реальном проекте классы с хранилищами надо будет заранее подгружать. Потом расскажу как я это делаю.

khusamov 21.06.2015 22:05

Цитата:

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

а так у меня аналогичные запарки были, спасибо обитателям этого форума - многие вопросы были решены

Пролетарий 21.06.2015 22:06

Цитата:

Сообщение от khusamov (Сообщение 375993)
Еще кое что нужно.

Прокси описывайте в моделях, а не в хранилищах.

Я думал наоборот правильно в сторах прокси писать, а в моделях - это для хипстеров. :)

Пролетарий 21.06.2015 22:07

Цитата:

Сообщение от khusamov (Сообщение 375994)
для данного пример я так понял это действительно не критично. Главное чтобы на сервер посылался запрос, в котором будет присутствовать номер Ордера, верно?
если да, то мы это в примере сделаем.

Да, именно так.

Пролетарий 21.06.2015 22:08

Цитата:

Сообщение от khusamov (Сообщение 375995)
пока все
жду когда внесете эти правки и можно будет дальше работать.

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

khusamov 21.06.2015 22:09

Цитата:

Я думал наоборот правильно в сторах прокси писать, а в моделях - это для хипстеров.
аналогично
сенча многое делает как-то странно, но в общем нормально получается...

кстати, предложение: если эта задача не кспеху, можно в среду-четверг ее быстро окучить по тимвиверу и скайпу
я просто сейчас работаю и не могу много уделять времени

Пролетарий 21.06.2015 22:10

Цитата:

Сообщение от khusamov (Сообщение 375996)
Кстати, я совсем забыл. Вы этот пример http://dev.sencha.com/extjs/5.1.0/ex...app/index.html смотрели? Я как раз на нем научился программировать подобные задачки.

Рекомендую также посмотреть. В нем вы увидите как оформляются виды, чтобы в них потом не запутаться.

Я по этому примеру многое для себя взял. У меня реальный код по папочками разбит, каждый вид и его контролеры в своей папке. Просто подумал, если не буду эту гору папок в примере делать, то будет проще. Но похоже наоборот усложнил. :)

Пролетарий 21.06.2015 22:20

Цитата:

Сообщение от khusamov (Сообщение 375999)
Неверно.

Модель вида ОРДЕРЫ будет содержать хранилище Ордеров

Модель вида ОРДЕР будет содержать хранилище Заметок этого ордера.

Уже БОЛЬШАЯ разница между этими двумя моделями.

Далее, в модели ОРДЕР будет поле singleOrder, которого в модели ОРДЕРЫ не будет. Оно там совершенно не нужно.

Так что вам что-то другое рекомендовали.

Модель вида для вида ЗАМЕТКИ скорее будет пустая, так как она будет пользоваться родительской. Но пока создайте пустую, а там видно будет - нужно ее удалить или нет.

А, ну всё верно. Для таблице с заметками у меня своя модель определена в файле NoteModel.js, а для таблицы ордеров и для закладки конкретного ордера своя модель в файле OrderModel.js. Надо было для ордера больше полей оставить, а то он стал похож с заметками. Добавлю ещё поля в ордер, чтобы было видно, что это отдельная модель, сама по себе и не связана с моделью заметок. Ну и папочки отделить помогут.

Пролетарий 21.06.2015 22:29

Цитата:

Сообщение от khusamov (Сообщение 376008)
аналогично
сенча многое делает как-то странно, но в общем нормально получается...

кстати, предложение: если эта задача не кспеху, можно в среду-четверг ее быстро окучить по тимвиверу и скайпу
я просто сейчас работаю и не могу много уделять времени

Хорошее предложение, не откажусь. Меня можно сказать время не поджимает, просто дальше всё связано с аналогичными вещами и по сути двигаться не решив этого не куда. Но я тогда попробую рефакторинг кода провести, а то всё равно без этого кроме меня кому-то сложно понять, да и время потребуется. Но надеюсь к этому времени всё же проблема разрешиться. :)

khusamov 21.06.2015 22:43

ок
когда код в примере приведете к порядку - сообщайте тут

Пролетарий 22.06.2015 15:51

Рассортировал файлы по папочкам в примере, но возможно он и не понадобиться для текущих моих проблем. https://fiddle.sencha.com/#fiddle/p53

Т.к. возникли проблемы с загрузкой данных, автономной и вложенной в форму таблицы, то решил попробовать сделать пока добавление и удаление строк этой таблицы и у меня кажется возникло просветление, а может наоборот ещё сильнее в заблуждение погрузился. : )

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

Получается что даже если я смогу при load() отправлять ИД ордера, для которого надо получить заметки, то стор заметок будет обновляться и там будут данные только для одного текущего ордера, а если у меня их открыто несколько, то они будет иметь одни и те же заметки, т.к. стор содержит заметки только для одного ордера. И стор будет заменяться при каждом load(). А это не то что нужно.

Получается, что мне надо получить все заметки для всех ордеров, как происходит сейчас, но добавить к полям заметок ещё ИД их родителя, т.е. ордера, к которому относятся заметки. А уже в самой таблице, каким-то образом показывать заметки, только для ордера, который открыт в текущей закладке.

Для того что я хотел изначально, в ExtJS получается нужно создать отдельный стор с заметками для каждого ордера, т.е. если у меня 100 ордеров, то должно быть создано 100 уникальных сторов с заметками. Не знаю, насколько это правильно с точки зрения ExtJS.

Кстати, придумал как передать в таблицу заметок ИД ордера, т.е. добавил в bind переменную с ИД, во время создания таблицы.
{
        xtype: 'noteGrid',
        fieldLabel: 'Заметки:',
    
        bind: {
            data: {
                orderId: '{singleOrder.id}'
            }
        },
    }


Правда получение этой перемененной внутри таблицы получается каким-то уродским:
this.getView().bind.data.lastValue.orderId


Похоже теперь надо добавить ИД ордера в json с заметками и придумать как выводить в таблице только нужные заметки.

khusamov 22.06.2015 17:07

Цитата:

Получается, что мне надо получить все заметки для всех ордеров, как происходит сейчас, но добавить к полям заметок ещё ИД их родителя, т.е. ордера, к которому относятся заметки. А уже в самой таблице, каким-то образом показывать заметки, только для ордера, который открыт в текущей закладке.
Мало чего понял, но этого точно делать не надо.

Нужно следовать следующему алгоритму:

Когда делаем даблклик по ордеру должны создаваться: вкладка, форма, хранилище для заметок данного ордера. При создании в экстра-параметрах нужно указывать номер ордера, чтобы в хранилище попали именно его заметки.

И все будет работать. Можно так открывать сколько угодно ордеров.

khusamov 22.06.2015 17:08

Цитата:

Для того что я хотел изначально, в ExtJS получается нужно создать отдельный стор с заметками для каждого ордера, т.е. если у меня 100 ордеров, то должно быть создано 100 уникальных сторов с заметками. Не знаю, насколько это правильно с точки зрения ExtJS.
Ага, так и нужно делать. Расход памяти не особо сильно увеличивается, но удобства явные.

khusamov 22.06.2015 17:09

Цитата:

Кстати, придумал как передать в таблицу заметок ИД ордера, т.е. добавил в bind переменную с ИД, во время создания таблицы.
Не так надо. Есть более простой способ. Прямо в экстра-парамс хранилища. Потом расскажу как сделать.

khusamov 22.06.2015 17:10

Цитата:

Правда получение этой перемененной внутри таблицы получается каким-то уродским:
this.getView().bind.data.lastValue.orderId
нужно так:

this.getView().getViewModel().get("orderId")


или так, если находимся в контроллере (или внутри вида)

this.getViewModel().get("orderId")

Пролетарий 22.06.2015 21:10

Цитата:

Сообщение от khusamov (Сообщение 376087)
Мало чего понял, но этого точно делать не надо.

Нужно следовать следующему алгоритму:

Когда делаем даблклик по ордеру должны создаваться: вкладка, форма, хранилище для заметок данного ордера. При создании в экстра-параметрах нужно указывать номер ордера, чтобы в хранилище попали именно его заметки.

И все будет работать. Можно так открывать сколько угодно ордеров.

Ну вот, а я только расслабился. :) А есть где-нибудь пример описанного алгоритма, а то я вроде делаю так как вижу во всех примерах, но ничего подобного не получается? А сам сообразить не могу.

Пролетарий 22.06.2015 21:13

Цитата:

Сообщение от khusamov (Сообщение 376088)
Ага, так и нужно делать. Расход памяти не особо сильно увеличивается, но удобства явные.

Но как это сделать не представляю. У меня все сторы глобальные. Скажу даже больше, если я их не объявлю в файле Application.js, то всегда лезет ошибка.

Ext.define('JournalApp.Application', {
    extend: 'Ext.app.Application',
    
    name: 'JournalApp',

    stores: [
        // TODO: add global / shared stores here
        'JournalApp.store.StrategyStore',
        'JournalApp.store.NoteStore',
        'JournalApp.store.OrderStore'
    ],
    
    launch: function () {
        // TODO - Launch the application
    }
});

Пролетарий 22.06.2015 21:26

Цитата:

Сообщение от khusamov (Сообщение 376090)
нужно так:

this.getView().getViewModel().get("orderId")


или так, если находимся в контроллере (или внутри вида)

this.getViewModel().get("orderId")

У меня не заработало, выдает null в обоих вариантах. Думаю потому что ViewModel нету у таблицы заметок. А тем способом что я сделал, получилось что ИД забиндинлся в сам view таблицы. Я этот переданный ИД даже нашел в параметре html: "<div orderId="118"></div>" если через консоль, смотрю на console.log(this.getView());

Наверное ИДу не место в вайве, но единственное что работает.

khusamov 23.06.2015 11:10

Цитата:

Но как это сделать не представляю. У меня все сторы глобальные. Скажу даже больше, если я их не объявлю в файле Application.js, то всегда лезет ошибка.
Хранилища вы верно прописали в приложении. Хотя не нужно там полное имя класса писать, можно только последнюю часть.

Но потом их надо подключать по алиасам.

Пролетарий 23.06.2015 12:33

Цитата:

Сообщение от khusamov (Сообщение 376169)
Хранилища вы верно прописали в приложении. Хотя не нужно там полное имя класса писать, можно только последнюю часть.

Но потом их надо подключать по алиасам.

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

khusamov 23.06.2015 14:08

Забивайте стрелку в тимвивере+скайпе на завтра. Мне было бы удобнее после 15:00 мск. Логин в скайпе khusamov

Пролетарий 23.06.2015 15:54

Цитата:

Сообщение от khusamov (Сообщение 376201)
Забивайте стрелку в тимвивере+скайпе на завтра. Мне было бы удобнее после 15:00 мск. Логин в скайпе khusamov

Мне в любое время, только без тимвивере. Может лучше гугловский Hangouts?

khusamov 24.06.2015 14:13

вы свои координаты не предоставили
так что пишите в скайп

khusamov 24.06.2015 16:08

ладно, как будете готовы пишите...

khusamov 24.06.2015 17:45

Проблема решена.
Код в песочнице https://fiddle.sencha.com/#fiddle/pcf

Пролетарий 24.06.2015 18:38

Спасибо огромное. :)

bastrakov 02.07.2015 16:26

что там не слава богу - не стал читать весь топик. но в данном примере резанул вызов родителей в начале initComponent.
imho оно должно быть последним.
попробуйте переставить 2-мя строчками ниже.
...и не тащите такой длинный топик. ктож читать будет всю историю. :-)

Цитата:

Сообщение от Пролетарий (Сообщение 375946)
initComponent: function() {
//       this.callParent();
        this.noteStore = Ext.getStore('Fiddle.store.NoteStore');
        this.on('render', this.loadStore, this);
       this.callParent();
    },


khusamov 04.07.2015 09:22

Цитата:

и не тащите такой длинный топик. ктож читать будет всю историю. :-)
я прочитал и помог в решении проблемы. В чем проблема?


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