Chained store
Здравствуйте.
Я пытаюсь использовать связанные сторы в приложении, но вот ничего нормального не выходит. Может быть коллективный разум справится? Задача: есть некий главный стор (ГС) который содержит информацию о всех юзерах приложения Ext.define('SafetyRound.store.ProjectUser', { extend: 'SafetyRound.store.InsistentStore', requires: ['SafetyRound.model.view.ProjectUser'], model: 'SafetyRound.model.view.ProjectUser', autoLoad: true, storeId: 'projectusersAll' }); ГС прописан в секции stores приложения, видно что загружается. В одном из вью у меня есть список админов. Я хотел связать его с ГС и отфильтровать по типу юзеров. Попробовал так (без фильтра пока, чисто эксперимент): Ext.define('SafetyRound.view.projectinfo.contacts.ShowModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.projectinfo-contacts-show' ,stores: { administrators: { source: '{projectusersAll}' } } }); Получил ошибку: Invalid source "projectusersAll" specified for Ext.data.ChainedStore. Пробовал и с фигурными скобками, и без, разницы нет. Следующая мысль была о том, что сорц должен быть определен во вьюмодели. Но вот как там заюзать уже имеющийся стор? Попытка: ,stores: { src: 'projectusersAll', administrators: { source: '{src}' } } Ошибка все та же, что в общем и не странно. ОК, решил пойти другим путем. Забрал стор из конфигов апликухи и сконфигурировал в главной вьюмодели (чтоб был доступен и в моделях дочерних вьюшек): Ext.define('SafetyRound.view.main.MainModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.main', // some default data data: { user: { DateFormat : 'Y-m-d', TimeFormat: 'H:i' } } ,stores: { projectusersAll : { extend: 'SafetyRound.store.InsistentStore', model: 'SafetyRound.model.view.ProjectUser', autoLoad: true } } }); Получил варнинг и ошибку: [W] Ext.data.Store created with no model. [E] Config "source" has no setter on class Ext.data.Store Не смотря на это, приложение запустилось, вот только в гриде ни заголовков ни данных. Наконец, я описал конфиг ГС в той-же вьюмодели: Ext.define('SafetyRound.view.projectinfo.contacts.ShowModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.projectinfo-contacts-show' ,stores: { projectusersAll : { extend: 'SafetyRound.store.InsistentStore', model: 'SafetyRound.model.view.ProjectUser', autoLoad: true }, administrators: { source: '{projectusersAll}', filters: [ function(item){ return true; } ] } } }); Вот так все работает хорошо. Но ведь это не то что я хотел... Если я в каждой модели буду описывать projectusersAll то мне и глобальный стор не нужен, просто получу кучу дублированных данных. Вопрос: как быть? |
|
http://docs.sencha.com/extjs/5.1/5.1...ore-cfg-source
Кстати, есть песочница для тестов https://fiddle.sencha.com/ |
Все оказалось гораздо веселее ) Я ведь не создал стор через Ext.create! Просто описал его конфиг с параметром autoload:1 , добавил в requires, а вот экземпляр то и не создал. В результате он и грузился, и не находился через сторменеджер. Добавил принудительное создание в контроллере - заработало!
Но и тут не обошлось без развлечения. Я воткнул было создание стора в метод Application.launch, так он не виделся по прежнему. А вот когда в контроллере главного вью создал - заработало! Ext.define('SafetyRound.view.main.MainController', { extend: 'Ext.app.ViewController', alias: 'controller.main', init: function(){ Ext.log('SafetyRound.view.main.MainController : init()'); Ext.create('SafetyRound.store.ProjectUser', { // <---------------- storeId: 'projectusersAll', autoLoad: true }); if(Assets.ready){ this.initData(); }else{ Assets.addListener("ready", this.initData, this, {single: true}); } } ... |
Почему не в приложение в свойства stores?
Вот тут: http://docs.sencha.com/extjs/5.1/5.1...ion-cfg-stores |
Пардон, ошибся когда писал. В stores я и добавлял, не в requires, но не работало.
|
Кстати, про фидл: я попробовал в нем набросать демку, но застрял в самом начале. Посмотрите пожалуйста:
https://fiddle.sencha.com/#fiddle/10pa Насколько я понял система не может найти мою модель. Куда ее надо поместить, в какую папку? |
Цитата:
Имя класса aModel надо заменить на Fiddle.aModel Модель нужно перекинуть в приложение вот так: https://fiddle.sencha.com/#fiddle/10ph Ext.application({ name : 'Fiddle', models: [ 'Fiddle.aModel' // вот здесь ошибка, но это особенность фидла, не может он без нэймспейса загрузить модель ], launch : function() { Ext.Msg.alert('Fiddle', 'Welcome to Sencha Fiddle!'); } }); Ext.define('Fiddle.aModel', {// а здесь вы по невнимательности забыли пространство имен Fiddle extends: 'Ext.data.Model', fields: [ 'Name' ] }); |
Так, что к чему в фидле я разобрался... Но вот как он работает - это мрак. Фидлы не удаляются, сохранение срабатывает через раз, а то и реже... Ошибки в консоли... Как с таким можно жить - не представляю. Интересно, это у всех так?
|
У меня фидл работает отлично. Сохранение работало всегда. Хотя сегодня утром заметил тоже эту проблему. Создаю под залогининым пользователем.
Принцип работы в том, что все файлы из / собираются в один, а потом всё это исполняется. Поиск файла по пространству имён не осуществляется. Requires указывать поэтому не обязательно. |
Часовой пояс GMT +3, время: 13:45. |