Как отключить 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? |
Подтаскивание Store через контроллер это такая недофича времён 4.0. Я сам её никогда не использую, именно потому что она приводит к невнятным результатам; к сожалению, и выкорчевать тоже нельзя, потому как документировано и должно работать. :(
Используйте вместо этого алиасы: Store: Код:
Ext.define('MyApp.store.Foo', { Код:
Ext.define('MyApp.view.FooGrid', { |
интересно, в этом случае точно хранилище будет в ОДНОМ экземпляре, а на местал лишь ссылки на него???
|
Будет-будет. Потрассируйте код, если мне не верите. ;)
|
я не неверю))) просто на первый взгляд ваше предложение похоже на то, что будет много инстантов.
Спасибо, буду пробовать. |
Я правильно понял, что следующие записи полностью идентичны?
alias: 'store.foo' и storeId: 'foo' |
То есть, если мне вдруг понадобиться хранилище то я его добывать должен так?
var fooStore = Ext.data.StoreManager.lookup({ type: "foo" }); Что-то в документации об этом почти ничего не сказано: http://docs.sencha.com/extjs/5.1/5.1...-method-lookup И ощущение, будто будет создано новое хранилище... |
Цитата:
alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) приведёт к тому, что для каждого вызова будет создаваться свой экземпляр хранилища с типом foo. |
Цитата:
|
Итак, если мне нужен ОДИН экземпляр то я должен использовать storeId и StoreManager.lookup(storeId)
Если несколько - то alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) Верно? Если верно, то: Вопрос из первого поста остается открытым, что мне делать, если мне нужен один экземпляр? То есть в гриде я хочу прописать: store: "MyStore" и в пэйджере: { xtype: "pagingtoolbar", store: "MyStore" } но при этом я хочу, чтобы и там и сям были ссылки на ОДНО хранилище, и чтобы не создавались экземпляры класса Ext.data.ChainedStore. Причем и там и сям конфиги в пределах метода define, где неуместно делать вызов StoreManager.lookup(storeId) так как на момент определения класса хранилище может быть не определено. |
Я всё же не могу понять, зачем вы пытаетесь использовать глобальное хранилище с pagingtoolbar. Глубоко смотреть в код сейчас возможности нет, но я сильно подозреваю, что ChainedStore было привинчено в этом случае как раз для избежания подобных ситуаций. То, что не все методы доступны, это баг конечно.
Можете подробнее объяснить, зачем вам такая конструкция? |
Как зачем? Я хочу чтобы можно было грид листать при помощи pagingtoolbar... вопрос не очень понял.
А он не листается. Ибо ошибку выдает: Uncaught TypeError: store.getTotalCount is not a function |
Я понимаю, что вам хочется листать таблицу при помощи pagingtoolbar. Вопрос в другом: зачем вам нужно листать глобальный экземпляр хранилища через эту таблицу?
Grid ведь не stateless, он состояние хранит в Store. А если один и тот же экземпляр Store используется в двух и более таблицах, то они будут наступать друг другу на виртуальные ноги. Именно поэтому я рекомендовал использовать alias и тем самым создавать отдельный экземпляр Store для каждой таблицы. Вам это почему-то не подходит, но я пока не могу понять, почему. Уточните задачу, пожалуйста. |
Я хотел использовать для создания своего field для выбора внешнего ключа. Аналогичного комбобоксу, только вместо списка - таблица.
Таких комбобоксов будет масса (например выбор контрагента будет производится во многих таблицах), ну и хотел чтобы они питались из одного хранилища. |
Судя по описанию задачи, именно для таких случаев ChainedStore и придумывалось: когда есть некое общее хранилище, по которому нужно иметь отдельные "срезы" со своим состоянием.
А вот с кодом что-то не то. Я попробовал воспроизвести проблему и навскидку всё работает, никаких ошибок. Давайте fiddle. |
Ах вон в чем дело... ладно, постараюсь разобраться. Если не выйдет - сделаю код в песочницу. Спасибо!
|
Часовой пояс GMT +3, время: 22:36. |