Sencha Touch 2 - 在项目中嵌入带有xtype的组件但不起作用

时间:2013-07-29 15:52:33

标签: sencha-touch-2

最近我试图自己学习ST2,然后发生错误。 我创建一个Ext.Component视图,然后我把它放到扩展Ext.Container的父视图。 不幸的是,我的页面中只有空气呈现。有人帮我吗?非常多。以下是我的代码。


app.js

Ext.application({
    name: 'myAPP',

    requires: [
        'Ext.MessageBox'
    ],

    models: [
        'Goods'
    ],

    views: [
        'Viewport',
        'GoodsList',
        'GoodsListItem'
    ],

    controllers: [],

    stores: [
        'GoodsList'
    ],
    // some basic codes...
});

Viewport.js - 查看

Ext.define('myAPP.view.Viewport', {
    extend: 'Ext.tab.Panel',

    xtype: 'viewport',

    config: {
        fullscreen: true,

        tabBarPosition: 'bottom',

        defaults: {
            styleHtmlContent: true
        },

        items: [
            {
                title: 'Series',
                iconCls: 'list',
                xtype: 'goodslist'
            }
        ]
    }
});

GoodsList.js - 查看

Ext.define('myAPP.view.GoodsList', {
    extend: 'Ext.Container',

    requires: [
        'Ext.TitleBar',
        'myAPP.view.GoodsListItem'
    ],

    xtype: 'goodslist',

    config: {
        layout: {
            type: 'fit'
        },

        items: [
            {
                xtype: 'titlebar',

                title: 'GoodsList',

                docked: 'top',

                items: [
                    {
                        iconCls: 'more',
                        align: 'right'
                    }
                ]
            },
            {
                xtype: 'goodslistitem'
            }
        ]
    }
});

GoodsListItem.js - view

Ext.define('myAPP.view.GoodsListItem', {
    extend: 'Ext.Component',

    xtype: 'goodslistitem',

    config: {
        store: 'goodsliststore',

        tpl: new Ext.XTemplate(
            '<tpl for=".">',
                '<div class="s-row">',
                    '<div class="s-col {[xindex % 2 === 0 ? "s-c2" : "s-c1"]}">',
                        '<img src="{thumb}" />',
                        '<h1>{#}. {pname}</h1>',
                        '{price}',
                    '</div>',
                '</div>',
            '</tpl>'
        )
    }
});

GoodsList.js - 存储

Ext.define('myAPP.store.GoodsList', {
    extend: 'Ext.data.Store',

    config: {
        model: 'myAPP.model.Goods',

        storeId: 'goodsliststore',

        data: [
            {
                pname: 'Goods',
                price: '5RMB',
                thumb: 'http://qlogo4.store.qq.com/qzone/181830631/181830631/100?1317298327'
            },
            {
                pname: 'Goods',
                price: '15RMB',
                thumb: 'http://qlogo4.store.qq.com/qzone/181830631/181830631/100?1317298327'
            },
            {
                pname: 'Goods',
                price: '25RMB',
                thumb: 'http://qlogo4.store.qq.com/qzone/181830631/181830631/100?1317298327'
            },
            {
                pname: 'Goods',
                price: '35RMB',
                thumb: 'http://qlogo4.store.qq.com/qzone/181830631/181830631/100?1317298327'
            }
        ]
    }
});

Goods.js - model

Ext.define('myAPP.model.Goods', {
    extend: 'Ext.data.Model',

    config: {
        fields: [
            { name: 'pname', type: 'string' },
            { name: 'price', type: 'int' },
            { name: 'thumb', type: 'string' }
        ]
    }
});

<小时/> ST版 - 触摸2.1.1

1 个答案:

答案 0 :(得分:2)

您似乎缺少一些在Sencha Touch中使用列表的基本概念。

您的GoodsList视图实际上没有Ext.dataview.List,因此您没有看到任何内容。 替换元素:

{
    xtype: 'goodslistitem'
}

使用列表组件,如:

{
    xtype: 'list'
}

现在让我们全屏显示,让我们使用您在GoodsListItem.js中定义的XTemplate作为列表的itemTpl

{
    xtype: 'list',
    fullscreen: true,
    itemTpl: new Ext.XTemplate(
        '<tpl for=".">',
            '<div class="s-row">',
                '<div class="s-col {[xindex % 2 === 0 ? "s-c2" : "s-c1"]}">',
                    '<img src="{thumb}" />',
                    '<h1>{#}. {pname}</h1>',
                    '{price}',
                '</div>',
            '</div>',
        '</tpl>'
    )

}

您实际上可以删除GoodsListItem.js视图。 如果您真的想要使用可以使用组件布局的单独列表项,则应设置defaultType配置,但这会降低性能并增加复杂性。如果您有兴趣,请查看Using Dataviews上的指南。

注意:我假设您的Ext.XTemplate语法正确无误。

[编辑]我的代码可能不会按原样运行:检查this question关于将XTemplate用作itemTpl

最后我们要说Sencha Touch哪个Store绑定到列表,这是通过商店配置完成的:

{
    xtype: 'list',
    fullscreen: true,
    itemTpl: new Ext.XTemplate(
        '<tpl for=".">',
            '<div class="s-row">',
                '<div class="s-col {[xindex % 2 === 0 ? "s-c2" : "s-c1"]}">',
                    '<img src="{thumb}" />',
                    '<h1>{#}. {pname}</h1>',
                    '{price}',
                '</div>',
            '</div>',
        '</tpl>'
    ),
    store: 'GoodsList'
}

这应该指向你正确的轨道。如果你问我,你正试图从头开始完成一些非常复杂的事情,我建议你从一个基本的列表示例开始:#/ p>

Ext.create('Ext.List', {
    fullscreen: true,
    itemTpl: '{title}',
    data: [
        { title: 'Item 1' },
        { title: 'Item 2' },
        { title: 'Item 3' },
        { title: 'Item 4' }
    ]
});

然后添加更复杂的内容,例如绑定到Ext.data.Store,使用Ext.Template作为itemTpl,然后添加Ext.XTemplate