Вход

Просмотр полной версии : Chained store


Infarch
09.11.2015, 14:15
Здравствуйте.

Я пытаюсь использовать связанные сторы в приложении, но вот ничего нормального не выходит. Может быть коллективный разум справится?

Задача: есть некий главный стор (ГС) который содержит информацию о всех юзерах приложения

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 то мне и глобальный стор не нужен, просто получу кучу дублированных данных.

Вопрос: как быть?

novikov
09.11.2015, 15:09
Укажите storeId (http://docs.sencha.com/extjs/6.0/6.0.0-classic/#!/api/Ext.data.Store-cfg-storeId) глобального стора в параметре source (http://docs.sencha.com/extjs/6.0/6.0.0-classic/#!/api/Ext.data.ChainedStore-cfg-source):

The backing data source for this chained store. Either a store instance or the id of an existing store.

khusamov
09.11.2015, 15:56
http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/#!/api/Ext.data.ChainedStore-cfg-source

Кстати, есть песочница для тестов https://fiddle.sencha.com/

Infarch
09.11.2015, 16:34
Все оказалось гораздо веселее ) Я ведь не создал стор через 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});
}
}
...

khusamov
09.11.2015, 16:53
Почему не в приложение в свойства stores?

Вот тут:
http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/#!/api/Ext.app.Application-cfg-stores

Infarch
09.11.2015, 17:16
Пардон, ошибся когда писал. В stores я и добавлял, не в requires, но не работало.

Infarch
09.11.2015, 17:43
Кстати, про фидл: я попробовал в нем набросать демку, но застрял в самом начале. Посмотрите пожалуйста:
https://fiddle.sencha.com/#fiddle/10pa
Насколько я понял система не может найти мою модель. Куда ее надо поместить, в какую папку?

khusamov
09.11.2015, 19:03
Куда ее надо поместить, в какую папку?

в папке Mock Data можно размещать ответы сервера или подгружаемые данные в формате json

Имя класса 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'
]
});

Infarch
09.11.2015, 23:58
Так, что к чему в фидле я разобрался... Но вот как он работает - это мрак. Фидлы не удаляются, сохранение срабатывает через раз, а то и реже... Ошибки в консоли... Как с таким можно жить - не представляю. Интересно, это у всех так?

novikov
10.11.2015, 10:14
У меня фидл работает отлично. Сохранение работало всегда. Хотя сегодня утром заметил тоже эту проблему. Создаю под залогининым пользователем.

Принцип работы в том, что все файлы из / собираются в один, а потом всё это исполняется.

Поиск файла по пространству имён не осуществляется. Requires указывать поэтому не обязательно.

XAPuTOH
10.11.2015, 13:48
У меня так работает:
1. создаю стор и подключаю его в секции stores приложения:
Ext.define('Client.store.objects.Tree', {
extend: 'Ext.data.TreeStore',

alias: 'store.objectstree',

model: 'Client.model.objects.Object',

autoLoad: true,
proxy: {
type: 'ajax',
url: '....'
}

});


можно прописать алиас.

2. в нужном мне ViewModel в разделе stores объявляю его:

stores: {
Objects: {
type: 'objectstree',
proxy:{
extraParams: {
relTypeId: '{relTypeId}'
}
}
}
}


если нет алиса то можно по пути помоему - вместо type: 'objectstree' указать type: 'Client.store.objects.Tree' .

3. во вьюхе :

bind: {
store: '{Objects}'
},


Все работает

khusamov
10.11.2015, 15:33
Фидлы не удаляются, сохранение срабатывает через раз, а то и реже... Ошибки в консоли..

Нужно зарегистрироваться, чтобы работало удаление/сохранение.

Сохраняется да, не ахти как хорошо. Но сохраняется. Даже переименовывать можно.

Ошибки в консоли - есть некоторые особенности использования - но это опытным путем выясняется.

Infarch
11.11.2015, 11:50
Так я зарегистрирован. Однако на качество работы это мало влияет.

Infarch
11.11.2015, 11:55
XAPuTOH, а попробуйте теперь усложнить задачу. Вот вы во вьюмодель некоего вью добавили стор Objects, хорошо. А теперь в этот вью добавьте некий дочерний вью, в items. И вот уже во вьюмодели этого нового вью создайте chainedstore ссылющийся на Objects.

khusamov
11.11.2015, 15:54
В общем публикуте не работающий фидлер - разберемся))) Пока фатальных проблем не было - методом тыка все решалось. Публикуйте и дайте тут ссыльку