Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Как отключить Ext.data.ChainedStore в видах, если само хранилище в контроллере? (https://javascript.ru/forum/extjs/56267-kak-otklyuchit-ext-data-chainedstore-v-vidakh-esli-samo-khranilishhe-v-kontrollere.html)

khusamov 07.06.2015 17:24

Как отключить 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?

nohuhu 08.06.2015 08:03

Подтаскивание 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
    ...
});

А контроллер сюда вообще не боком.

khusamov 08.06.2015 22:50

интересно, в этом случае точно хранилище будет в ОДНОМ экземпляре, а на местал лишь ссылки на него???

nohuhu 09.06.2015 03:53

Будет-будет. Потрассируйте код, если мне не верите. ;)

khusamov 09.06.2015 13:20

я не неверю))) просто на первый взгляд ваше предложение похоже на то, что будет много инстантов.

Спасибо, буду пробовать.

khusamov 11.06.2015 22:25

Я правильно понял, что следующие записи полностью идентичны?

alias: 'store.foo'


и

storeId: 'foo'

khusamov 11.06.2015 22:38

То есть, если мне вдруг понадобиться хранилище то я его добывать должен так?

var fooStore = Ext.data.StoreManager.lookup({
	type: "foo"
});


Что-то в документации об этом почти ничего не сказано:
http://docs.sencha.com/extjs/5.1/5.1...-method-lookup

И ощущение, будто будет создано новое хранилище...

nohuhu 11.06.2015 23:20

Цитата:

Сообщение от khusamov (Сообщение 374794)
Я правильно понял, что следующие записи полностью идентичны?

alias: 'store.foo'


и

storeId: 'foo'

Нет, неправильно. storeId нужно использовать для глобальных хранилищ, которые доступны всему приложению и существуют в единственном экземпляре. StoreManager.lookup('foo') каждый раз будет возвращать один и тот же экземпляр. Проблема в том, что любые изменения в этом хранилище будут соответственно отражаться на всех видах, которые привязаны к этому хранилищу. Иногда именно это и нужно, но гораздо реже, чем может показаться на первый взгляд.

alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) приведёт к тому, что для каждого вызова будет создаваться свой экземпляр хранилища с типом foo.

khusamov 12.06.2015 00:45

Цитата:

alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) приведёт к тому, что для каждого вызова будет создаваться свой экземпляр хранилища с типом foo.
так я выше спрашивал же, сколько их будет, один или несколько... теперь оказывается их будет несколько... запутали.

khusamov 12.06.2015 00:49

Итак, если мне нужен ОДИН экземпляр то я должен использовать storeId и StoreManager.lookup(storeId)

Если несколько - то alias: 'store.foo' и StoreManager.lookup({ type: 'foo' })

Верно?

Если верно, то:

Вопрос из первого поста остается открытым, что мне делать, если мне нужен один экземпляр?

То есть в гриде я хочу прописать:

store: "MyStore"


и в пэйджере:

{
	xtype: "pagingtoolbar",
	store: "MyStore"
}


но при этом я хочу, чтобы и там и сям были ссылки на ОДНО хранилище, и чтобы не создавались экземпляры класса Ext.data.ChainedStore. Причем и там и сям конфиги в пределах метода define, где неуместно делать вызов StoreManager.lookup(storeId) так как на момент определения класса хранилище может быть не определено.


Часовой пояс GMT +3, время: 15:46.