如何定义将组件添加到DataItem的顺序

时间:2012-09-04 22:38:21

标签: javascript sencha-touch-2

我已经阅读了tutorial关于使用自定义组件为Store中的每个元素创建DataView的信息。它说关于将记录的字段映射到DataItem中的组件,但我的问题是如何定义将组件添加到DataItem的顺序。

例如,我有这样的DataItem:

Ext.define('demo.view.CottageItem', {
    extend: 'Ext.dataview.component.DataItem',
    requires: ['Ext.Label', 'Ext.Array', 'Ext.Img'],
    xtype: 'listitem',

    config: {
        layout: {
            type: 'hbox',
            align: 'center',
            pack: 'start',
        },
        title: {
            flex: 1
        },
        photo: {
            width: '140px',
            height: '140px'
        },

        dataMap: {
            getTitle: {
                setHtml: 'title'
            },
            getPhoto: {
                setSrc: 'photo'
            }
        },
        styleHtmlContent: true
    },

    applyTitle: function(config) {
        return Ext.factory(config, Ext.Label, this.getTitle());
    },

    updateTitle: function(newTitle, oldTitle) {
        if (oldTitle) {
            this.remove(oldTitle);
        }

        if (newTitle) {
            this.add(newTitle);
        }
    },

    applyPhoto: function(config) {
        return Ext.factory(config, Ext.Img, this.getPhoto());
    },

    updatePhoto: function(newImage, oldImage) {
        if (oldImage) {
            this.remove(oldImage);
        }

        if (newImage) {
            this.add(newImage);
        }
    },
});

它的布局类型为hbox,因此我希望首先添加照片,然后添加标题。所以标题就在照片的右侧。我怎样才能做到这一点?

另一个问题是,有没有办法在这个DataItem中添加另一个容器,其中可以插入我的Label和Image?

更新 现在我的布局看起来像这样:

|标签(标题)| |图像(照片)|

我希望它看起来像这样:

|图像(照片)| |标签(标题)|

2 个答案:

答案 0 :(得分:3)

最后我明白了如何解决我的问题,这是我的代码:

Ext.define('demo.view.CottageItem', {
    extend: 'Ext.dataview.component.DataItem',
    requires: ['Ext.Label', 'Ext.Array', 'Ext.Img'],
    xtype: 'listitem',

    config: {
        layout: {
            type: 'hbox',
            align: 'center',
            pack: 'start',
        },
        title: {
            style: {
                'font-weight': 'bold'
            }
        },
        photo: {
            width: '140px',
            height: '140px'
        },
        desc: {},

        dataMap: {
            getTitle: {
                setHtml: 'title'
            },
            getPhoto: {
                setSrc: 'photo'
            },
            getDesc: {
                setHtml: 'desc'
            },
        },
        styleHtmlContent: true,
        items: [
            {
                xtype: 'panel',
                itemId: 'photoContainer',
            },
            {
                xtype: 'panel',
                layout: {
                    type: 'vbox'
                },
                itemId: 'textContainer',
                flex: 1,
            }
        ],
    },

    applyTitle: function(config) {
        return Ext.factory(config, Ext.Label, this.getTitle());
    },

    updateTitle: function(newTitle, oldTitle) {
        if (oldTitle) {
            this.getComponent('textContainer').remove(oldTitle);
        }

        if (newTitle) {
            this.getComponent('textContainer').add(newTitle);
        }
    },

    applyPhoto: function(config) {
        return Ext.factory(config, Ext.Img, this.getPhoto());
    },

    updatePhoto: function(newImage, oldImage) {
        if (oldImage) {
            this.getComponent('photoContainer').remove(oldImage);
        }

        if (newImage) {
            this.getComponent('photoContainer').add(newImage);
        }
    },

    applyDesc: function(config) {
        return Ext.factory(config, Ext.Label, this.getDesc());
    },

    updateDesc: function(newDesc, oldDesc) {
        if (oldDesc) {
            this.getComponent('textContainer').remove(oldDesc);
        }

        if (newDesc) {
            this.getComponent('textContainer').add(newDesc);
        }
    },
});

我没有在root用户中添加组件,而是在DataItem中定义了两个面板(占位符)。我使用getComponent方法访问它们并将我的组件添加到所需的位置。这里唯一的问题是添加到textContainer的项目顺序是未定义的,但在我的情况下,我得到了所需的顺序。

答案 1 :(得分:0)

更改后端存储的排序顺序?我不确定基于组件的DataView,但是基于元素的匹配来存储排序。

要正确设置(或更改)排序,您必须阅读Store的config sorters属性或sort函数

干杯,奥列格