Исключение при настройке слушателя для событий магазина в контроллере - PullRequest
0 голосов
/ 24 января 2012

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

Ext.define('Photoalbum.view.Table', {
extend : 'Ext.dataview.DataView',
xtype  : 'photoalbum-table',

config : {
    width: 3000, 
    height: 3000,
    itemTpl: new Ext.XTemplate(
        '<tpl for=".">',
        '<div class="x-panel x-floating" style="width: {width+12}px !important; height: {height+12}px !important; top: {top}px !important; left: {left}px !important;">',
        '   <img src="{url}">',
        '</div></tpl>'
    )
},

constructor : function(config) {
    Ext.apply(config, {
        store : Ext.create('Photoalbum.store.Images')   //I don't like using storeId (or any other id) so I create the store class
    });

    this.callParent([config]);
    this.getStore().on('load', Photoalbum.getController('App').handleImagesLoad, this);
    this.getStore().load();
}
});

Там я получаю следующее исключение:

Uncaught TypeError: Object #<Object> has no method 'getController'
Ext.define.constructorTable.js:23
Ext.apply.create.fsencha-touch-all.js:15
(anonymous function)
Ext.ClassManager.instantiatesencha-touch-all.js:15
Ext.ClassManager.instantiateByAliassencha-touch-all.js:15
Ext.apply.factorysencha-touch-all.js:15
Ext.define.factoryItemsencha-touch-all.js:15
Ext.define.addsencha-touch-all.js:15
b.implement.callParentsencha-touch-all.js:15
override.addsencha-touch-all.js:15
Ext.define.applyItemssencha-touch-all.js:15
b.registerPreprocessor.Ext.Object.each.i.(anonymous function)sencha-touch-all.js:15
b.registerPreprocessor.Ext.Object.each.i.(anonymous function).g.(anonymous     function)sencha-touch-all.js:15
Ext.define.applyActiveItemsencha-touch-all.js:15
(anonymous function)sencha-touch-all.js:15
b.implement.initConfigsencha-touch-all.js:15
Ext.define.initializesencha-touch-all.js:15
Ext.define.constructorsencha-touch-all.js:15
b.implement.callParentsencha-touch-all.js:15
Ext.define.constructorsencha-touch-all.js:15
b.implement.callParentsencha-touch-all.js:15
Ext.define.override.constructorsencha-touch-all.js:15
b.implement.callParentsencha-touch-all.js:15
Ext.define.constructorsencha-touch-all.js:15
b.implement.callParentsencha-touch-all.js:15
override.constructorsencha-touch-all.js:15
Ext.apply.create.fsencha-touch-all.js:15
(anonymous function)
Ext.ClassManager.instantiatesencha-touch-all.js:15
(anonymous function)sencha-touch-all.js:15
Ext.apply.createsencha-touch-all.js:15
Ext.define.onBeforeLaunchApplication.js:30
Ext.apply.onDocumentReadysencha-touch-all.js:15
Ext.apply.onReady.nsencha-touch-all.js:15
Ext.apply.triggerReadysencha-touch-all.js:15
Ext.apply.refreshQueuesencha-touch-all.js:15
Ext.apply.refreshQueuesencha-touch-all.js:15
Ext.apply.refreshQueuesencha-touch-all.js:15
Ext.apply.onFileLoadedsencha-touch-all.js:15
(anonymous function)sencha-touch-all.js:15
Ext.apply.injectScriptElement.ksencha-touch-all.js:15

Если я вызываю самоопределяемую функцию, вместо попытки вызова определенной Контроллером функции, оно работает.Для других способов, описанных выше, либо функция не вызывается, либо изображения не отображаются на виде.В основном без вывода на консоль.

Возможно, есть какие-нибудь хорошие примеры, которые это реализовали?Пока я нахожу только составляющие события.

С наилучшими пожеланиями, Даниэль

1 Ответ

0 голосов
/ 13 февраля 2012

Используете ли вы архитектуру Sencha MVC? Я предполагаю, что вы просматриваете свой код.

Если вы, вы должны определить свой магазин в app/store/Images.js, а в вашем app.js файле сказать, что у вас есть этот магазин:

Ext.application({
    name: 'Photoalbum',
    stores: ['Images']
});

Теперь, когда вы определили это хранилище и включили его в файл app.js, вы можете получить к нему доступ в любое время, используя его имя:

{
    xtype: 'list',
    store: 'Images',
    ...
}

Вы должны никогда воссоздать экземпляр этого хранилища. Он должен быть создан только один раз (вашим приложением), и тогда вы можете использовать строковую версию магазина.

Кроме того, как быстрое замечание, переопределять конструктор - очень плохая практика. Вместо этого вы должны переопределить метод initialize.

...