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

Posted

技术标签:

【中文标题】如何定义将组件添加到 DataItem 的顺序【英文标题】:How to define order in which components are added to DataItem 【发布时间】:2012-09-04 22:38:21 【问题描述】:

我读过一篇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 中添加另一个容器,可以在其中插入我的标签和图像?

更新: 现在我的布局是这样的:

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

我希望它看起来像这样:

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

【问题讨论】:

【参考方案1】:

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

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 的项目顺序未定义,但在我的情况下,我得到了所需的顺序。

【讨论】:

【参考方案2】:

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

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

干杯,奥列格

【讨论】:

不,不是存储中项目的顺序,而是视图组件添加到 DataItem 的顺序。我更新了我的问题 是的,这正是我的意思。如果您更改商店中的排序 => 您会更改 UI 上的布局。在创建数据视图之后,您是否在运行时执行此操作。你检查过吗?对于基于元素的数据视图,它可以 100% 工作 我说的是单个 DataItem 中的组件顺序,而不是整个 DataView。并且只是为了确保我尝试更改存储内的记录顺序并且单个 DataItem 的布局没有改变。

以上是关于如何定义将组件添加到 DataItem 的顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义样式添加到样式组件?

如何在 KendoGrid 单元格自定义单击上将 dataItem 传递给 js 函数

如何将自定义列添加到数据表?

如何将现有的 JSF 组件添加到我自己的自定义组件中?

如何将自定义复选框组件添加到 JIRA 评论?

为 vuetify 组件添加颜色