3

我已经阅读了有关为 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);
        }
    },
});

它有 layout type hbox,所以我想先添加照片然后添加标题。因此,该标题将位于照片的右侧。我怎样才能做到这一点?

另一个问题是,有没有办法在这个里面添加另一个容器DataItem,可以在其中插入我的标签和图像?

更新: 现在我的布局如下所示:

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

我希望它看起来像这样:

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

4

2 回答 2

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);
        }
    },
});

我没有将组件添加到根目录,而是在DataItem. 我使用getComponent方法访问它们并将我的组件添加到所需的位置。这里唯一的问题是添加到的项目的顺序textContainer是未定义的,但在我的情况下,我得到了想要的顺序。

于 2012-09-05T19:19:59.440 回答
0

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

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

干杯,奥列格

于 2012-09-04T23:02:41.350 回答