список не загружается на панели в sencha touch

Я пытаюсь загрузить List в Panel, но получаю следующую ошибку

Uncaught TypeError: Cannot call method 'substring' of undefined 

вот мой ProfileContainer.js, который содержит List

Ext.define('demo.view.ProfileContainer', {
    extend: 'Ext.Panel',
    xtype: 'profilecontainer',
   // requires: [ 'Ext.TitleBar', 'demo.view.ProfileList' ],
    requires: [ 'Ext.TitleBar' ],
    config: {
        items: [{
            xtype: 'titlebar',
            title: 'demo',
            cls: 'bms-bg'
        }, {
            xtype: 'profilelist'
        }]
    }
});

вот код ProfileList.js

Ext.define('demo.view.ProfileList', {
    extend: 'Ext.dataview.List',
    alias: 'widget.profilelist',
    requires: ['demo.store.ProfileStore'],
    config: {
        store: 'ProfileStore',
        itemTpl: '{name}',
    }
});

вот мой ProfileStore.js

Ext.define('demo.store.ProfileStore',{

    extend:'Ext.data.Store',

    config: {
        model: 'demo.model.ProfileModel',
        data:[

            { name: 'John Rambo' },
            { name: 'Brad Pitt'}

        ]
    }
});

и ProfileModel.js

Ext.define('demo.model.ProfileModel', {
    extend: 'Ext.data.Model',
    config: {
        fields: [

            { name: 'name', type: 'string' }
        ]
    }
});

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


person Hunt    schedule 26.07.2013    source источник


Ответы (1)


xtypes - это псевдоним, определенный как widget

Поэтому вам нужно определить их следующим образом:

alias:'widget.profilecontainer',

or

alias:'widget.profilelist',

Немного информации о require и uses:

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

Зависимости — одна из причин, по которой вы используете require или uses, где require может угрожать как строгий, потому что это гарантирует, что класс появится, как только он потребуется.

И вот в чем разница: потому что это недействительно при ленивой загрузке. В это время требуемый класс будет доступен после определения класса. Инструмент сборки убирает это и помещает необходимые классы перед определением класса

в то время как uses можно рассматривать как проигрыш, потому что он гарантирует, что класс существует только во время вызова Ext.onReady.

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

Ext.require('class'); 

которые должны быть размещены перед определением класса.

person sra    schedule 26.07.2013
comment
я определил alias:'widget.profilelist' в ProfileList.js и использую его как xtype:'profilelist' в ProfileContainer.js, но все равно получаю ту же ошибку - person Hunt; 26.07.2013
comment
@Hunt, пожалуйста, дополните свой вопрос новыми фрагментами кода. - person sra; 26.07.2013
comment
@sra На самом деле все, что вам нужно в ST2, это xtype: 'my-xtype', он работает так же, как alias: 'widget.my-xtype' в ExtJS 4. - person kevhender; 26.07.2013
comment
я изменил код, но, как я уже сказал, если я использую xtype или псевдоним, он не загружается, что дает мне ту же ошибку - person Hunt; 26.07.2013
comment
@kevhender Спасибо за подсказку. Я не привык к ST. Я до сих пор не могу понять, чем эти два фреймворка от одной компании такие разные. По крайней мере ядро ​​должно совпадать. - person sra; 26.07.2013
comment
@sra после твоего предложения я получаю Uncaught TypeError: Cannot call method 'deprecate' of undefined ошибку - person Hunt; 26.07.2013
comment
@Hunt Да, моя вина. Эти фреймворки все еще чертовски разные... Но я думаю, что ваша проблема в том, что xtype, о котором вы говорите, не был загружен. Вы построили проект перед тестированием? - person sra; 26.07.2013
comment
Есть ли необходимость в сборке, поскольку я добавил все ссылки в app.js и обновляю страницу, я думаю, этого будет достаточно, обряд? - person Hunt; 26.07.2013
comment
@sra, когда я заменяю путь в app.json на path: "../touch/sencha-touch-debug.js, он работает нормально, поэтому я думаю, что ты прав, как если бы он был secha-touch.js в производственном режиме, который требует сборки - person Hunt; 26.07.2013