Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.06.2015, 17:24
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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?
Ответить с цитированием
  #2 (permalink)  
Старый 08.06.2015, 08:03
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 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
    ...
});
А контроллер сюда вообще не боком.
Ответить с цитированием
  #3 (permalink)  
Старый 08.06.2015, 22:50
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

интересно, в этом случае точно хранилище будет в ОДНОМ экземпляре, а на местал лишь ссылки на него???
Ответить с цитированием
  #4 (permalink)  
Старый 09.06.2015, 03:53
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Будет-будет. Потрассируйте код, если мне не верите. ;)
Ответить с цитированием
  #5 (permalink)  
Старый 09.06.2015, 13:20
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

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

Спасибо, буду пробовать.
Ответить с цитированием
  #6 (permalink)  
Старый 11.06.2015, 22:25
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

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

alias: 'store.foo'


и

storeId: 'foo'
Ответить с цитированием
  #7 (permalink)  
Старый 11.06.2015, 22:38
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

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

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


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

И ощущение, будто будет создано новое хранилище...
Ответить с цитированием
  #8 (permalink)  
Старый 11.06.2015, 23:20
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

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

alias: 'store.foo'


и

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

alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) приведёт к тому, что для каждого вызова будет создаваться свой экземпляр хранилища с типом foo.
Ответить с цитированием
  #9 (permalink)  
Старый 12.06.2015, 00:45
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Цитата:
alias: 'store.foo' и StoreManager.lookup({ type: 'foo' }) приведёт к тому, что для каждого вызова будет создаваться свой экземпляр хранилища с типом foo.
так я выше спрашивал же, сколько их будет, один или несколько... теперь оказывается их будет несколько... запутали.
Ответить с цитированием
  #10 (permalink)  
Старый 12.06.2015, 00:49
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отключить js в адаптивной верстке на определенной ширине??? Gasherez (X)HTML/CSS 3 28.08.2013 09:57
Как сделать: если один инпут заполнен, то в другой вводить нельзя? Fenec Events/DOM/Window 4 12.11.2010 19:32
Подскажите как сделать меню на CSS если: greatilya (X)HTML/CSS 10 18.10.2009 20:26
можно ли, если да то как удалить строки из таблицы Avaria Я не знаю javascript 3 11.06.2009 03:03
Как сравнить класс, если их много!? Sc@M Events/DOM/Window 16 29.08.2008 12:47