07.06.2015, 17:24
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Как отключить Ext.data.ChainedStore в видах, если само хранилище в контроллере?
Если в контроллере прописать хранилище:
stores: ["MyStore"]
а в виде grid прописать это хранилище таким образом:
store: "MyStore"
То в гриде появятся записи из этого хранилища.
Далее если прописать в грид пэйджер
{
xtype: "pagingtoolbar",
store: "MyStore"
}
то появится ошибка:
Uncaught TypeError: store.getTotalCount is not a function
То есть пэйджер не смог в store найти этот метод.
После долгого ковыряние исходников выяснил, что оказывается, если хранилище прописать в контроллере и потом на него ссылаться из вида, то там, на местах будет создаваться не ссылка на хранилище, а экземпляр класса Ext.data.ChainedStore, у которого нет метода getTotalCount() (да и многих других методов нет).
Вопрос, как заставить туда прописывать ссылку на хранилище, а не создавать экземпляр Ext.data.ChainedStore?
|
|
08.06.2015, 08:03
|
|
Профессор
|
|
Регистрация: 21.05.2015
Сообщений: 321
|
|
Подтаскивание Store через контроллер это такая недофича времён 4.0. Я сам её никогда не использую, именно потому что она приводит к невнятным результатам; к сожалению, и выкорчевать тоже нельзя, потому как документировано и должно работать. :(
Используйте вместо этого алиасы:
Store:
Код:
|
Ext.define('MyApp.store.Foo', {
extend: 'Ext.data.Store',
alias: 'store.foo',
// Тут базовый конфиг и методы для всех экземпляров Foo
...
}); |
Grid:
Код:
|
Ext.define('MyApp.view.FooGrid', {
extend: 'Ext.grid.Panel',
xtype: 'foogrid', // или alias: 'widget.foogrid',
requires: [
'MyApp.store.Foo'
],
store: {
type: 'foo', // -> store.foo
// Тут конфиг для каждого экземпляра Foo store
},
// Конфиг FooGrid
...
}); |
А контроллер сюда вообще не боком.
|
|
08.06.2015, 22:50
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
интересно, в этом случае точно хранилище будет в ОДНОМ экземпляре, а на местал лишь ссылки на него???
|
|
09.06.2015, 03:53
|
|
Профессор
|
|
Регистрация: 21.05.2015
Сообщений: 321
|
|
Будет-будет. Потрассируйте код, если мне не верите. ;)
|
|
09.06.2015, 13:20
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
я не неверю))) просто на первый взгляд ваше предложение похоже на то, что будет много инстантов.
Спасибо, буду пробовать.
|
|
11.06.2015, 22:25
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Я правильно понял, что следующие записи полностью идентичны?
alias: 'store.foo'
и
storeId: 'foo'
|
|
11.06.2015, 22:38
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
То есть, если мне вдруг понадобиться хранилище то я его добывать должен так?
var fooStore = Ext.data.StoreManager.lookup({
type: "foo"
});
Что-то в документации об этом почти ничего не сказано:
http://docs.sencha.com/extjs/5.1/5.1...-method-lookup
И ощущение, будто будет создано новое хранилище...
|
|
11.06.2015, 23:20
|
|
Профессор
|
|
Регистрация: 21.05.2015
Сообщений: 321
|
|
Сообщение от khusamov
|
Я правильно понял, что следующие записи полностью идентичны?
alias: 'store.foo'
и
storeId: 'foo'
|
Нет, неправильно. storeId нужно использовать для глобальных хранилищ, которые доступны всему приложению и существуют в единственном экземпляре. StoreManager.lookup('foo') каждый раз будет возвращать один и тот же экземпляр. Проблема в том, что любые изменения в этом хранилище будут соответственно отражаться на всех видах, которые привязаны к этому хранилищу. Иногда именно это и нужно, но гораздо реже, чем может показаться на первый взгляд.
alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) приведёт к тому, что для каждого вызова будет создаваться свой экземпляр хранилища с типом foo.
|
|
12.06.2015, 00:45
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Цитата:
|
alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) приведёт к тому, что для каждого вызова будет создаваться свой экземпляр хранилища с типом foo.
|
так я выше спрашивал же, сколько их будет, один или несколько... теперь оказывается их будет несколько... запутали.
|
|
12.06.2015, 00:49
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Итак, если мне нужен ОДИН экземпляр то я должен использовать storeId и StoreManager.lookup(storeId)
Если несколько - то alias: 'store.foo' и StoreManager.lookup({ type: 'foo' })
Верно?
Если верно, то:
Вопрос из первого поста остается открытым, что мне делать, если мне нужен один экземпляр?
То есть в гриде я хочу прописать:
store: "MyStore"
и в пэйджере:
{
xtype: "pagingtoolbar",
store: "MyStore"
}
но при этом я хочу, чтобы и там и сям были ссылки на ОДНО хранилище, и чтобы не создавались экземпляры класса Ext.data.ChainedStore. Причем и там и сям конфиги в пределах метода define, где неуместно делать вызов StoreManager.lookup(storeId) так как на момент определения класса хранилище может быть не определено.
Последний раз редактировалось khusamov, 12.06.2015 в 00:54.
|
|
|
|