Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 21.06.2015, 11:30
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #12 (permalink)  
Старый 21.06.2015, 11:33
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Цитата:
(У формы свой стор, у таблицы свой.)
Сделайте пример в песочнице. А то из этой фразы много чего вытекает.
Ответить с цитированием
  #13 (permalink)  
Старый 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, выполняющем всю эту логику есть информация о выбранной строке.

Поправьте, если я чего недопонял в задаче.
Ответить с цитированием
  #14 (permalink)  
Старый 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.
Ответить с цитированием
  #15 (permalink)  
Старый 21.06.2015, 13:34
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #16 (permalink)  
Старый 21.06.2015, 13:36
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Цитата:
Я когда задумал это дело, то рассчитывал, что при открытии формы, в которую вложена таблица заметок, то при её создании я передам в store фильтр с ИД ордера и затем произойдет autoload и всё будет как в сказке. Но в реальности autoload вызывается при открытии приложения, само собой без нужного ИД, а при открытии формы, где находится таблицы, которую надо загрузить, никакого autoload не происходит. Поэтому весь этот код в initComponent.
Еще раз:

1) открытие формы нужно поменять на СОЗДАНИЕ формы и создание всего что в ней

2) автолоад нужен

3) сторе нужно подключать через алиасы, тогда автолоад будет работать не при создании приложения, а при создании формы (аля создании сторе)
Ответить с цитированием
  #17 (permalink)  
Старый 21.06.2015, 13:39
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

для лучшего понимания создайте код в песочнице
Ответить с цитированием
  #18 (permalink)  
Старый 21.06.2015, 13:48
Аспирант
Отправить личное сообщение для Пролетарий Посмотреть профиль Найти все сообщения от Пролетарий
 
Регистрация: 01.06.2015
Сообщений: 57

Пытаюсь, но там не меньше сложностей чем в реальном проекте. Уже не один раз пробовал, но пробиться через кучу ошибок не могу. Вот для данной проблемы пробую, но получаю ошибку, которая для меня мало информативна. Если не сложно гляньте, может поможете через проблемы песочницы пробраться, чтобы решить реальную.

https://fiddle.sencha.com/#fiddle/p53

Сообщение от khusamov Посмотреть сообщение
для лучшего понимания создайте код в песочнице
Ответить с цитированием
  #19 (permalink)  
Старый 21.06.2015, 14:04
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
  #20 (permalink)  
Старый 21.06.2015, 14:05
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Цитата:
Пытаюсь, но там не меньше сложностей чем в реальном проекте.
у всех аналогичные проблемы...
но код надо делать маленький, чтобы локализовать ошибку
иначе очень сложно помогать... времени в обрез.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 19:48
Dojo/store/Memory объект как store для DataGrid abstract Dojo toolkit 7 08.02.2013 15:12
Как получить данные из opener в open melihovgv Javascript под браузер 1 07.12.2012 08:36
как получить offsetHeight для элемента с display:none cyber Events/DOM/Window 4 01.06.2012 18:19
Данные из store не успевают попадать в chart kalya ExtJS 0 02.11.2011 12:14