我想在看起来像这样的列表中创建数据项:

但是我无法使用3个组件来渲染中间vbox部分。
我正在关注以下示例:http://www.sencha.com/blog/dive-into-dataview-with-sencha-touch-2-beta-2/

这就是我定义数据项的方式:

Ext.define('MyTabApp.view.CartListItem', {
    extend  : 'Ext.dataview.component.DataItem',
    alias   : 'widget.cartlistitem',
    requires: [
               'Ext.Img'
    ],
    config  : {
        cls: 'cart-list-item',
        layout: {
            type: 'hbox',
            align: 'center'
        },
        image: true,
        details: {
            cls: 'x-details',
            flex: 3,
        },
        pricing: {
            cls: 'x-pricing',
            flex: 1
        },
        removeButton: {
            iconCls     : 'delete',
            iconMask    : true,
            ui          : 'astonvilla',
            style       : 'margin-left: 5px; margin-top:10px; padding:5px;'
        },
        moveButton: {
            iconCls     : 'reply',
            iconMask    : true,
            ui          : 'astonvilla',
            style       : 'margin-left: 5px; margin-top:10px; padding:5px;'
        },
        editButton: {
            iconCls     : 'compose',
            iconMask    : true,
            ui          : 'astonvilla',
            style       : 'margin-left: 5px; margin-top:10px; padding:5px;'
        },
        dataMap: {
            getImage: {
                setSrc          : 'itemImage'
            },

            getDetails: {
                setItemTitle    : 'title',
                setQuantity     : 'quantity'
            },

            getPricing: {
                setHtml         : 'totalPrice'
            },
        },
    },
    applyImage: function(config) {
        return Ext.factory(config, Ext.Img, this.getImage());
    },

    updateImage: function(newImage, oldImage) {
        if (newImage) {
            this.add(newImage);
        }

        if (oldImage) {
            this.remove(oldImage);
        }
    },

    applyDetails: function(config) {
        console.log("applyDetails");
        var details = Ext.factory(config, MyTabApp.view.CartListItemDetails, this.getDetails());
        console.log("applyDetails done");
        console.log(details);
        return details;
    },

    updateDetails: function(newDetails, oldDetails) {
        console.log("updateDetails");
        if (newDetails) {
            this.add(newDetails);
        }

        if (oldDetails) {
            this.remove(oldDetails);
        }
    },

    applyPricing: function(config) {
        return Ext.factory(config, Ext.Component, this.getPricing());
    },

    updatePricing: function(newPricing, oldPricing) {
        if (newPricing) {
            this.add(newPricing);
        }

        if (oldPricing) {
            this.remove(oldPricing);
        }
    },

    applyRemoveButton: function(config) {
        return Ext.factory(config, Ext.Button, this.getRemoveButton());
    },

    updateRemoveButton: function(newRemoveButton, oldRemoveButton) {
        if (oldRemoveButton) {
            this.remove(oldRemoveButton);
        }

        if (newRemoveButton) {
            // add an event listeners for the `tap` event onto the new button, and tell it to call the onNameButtonTap method
            // when it happens
            newRemoveButton.on('tap', this.onRemoveButtonTap, this);

            this.add(newRemoveButton);
        }
    },

    onRemoveButtonTap: function(button, e) {
        var record = this.getRecord();

        Ext.Msg.alert(
            record.get('title'), // the title of the alert
            "Id of this item is: " + record.get('itemId') // the message of the alert
        );
    },

    applyEditButton: function(config) {
        return Ext.factory(config, Ext.Button, this.getEditButton());
    },

    updateEditButton: function(newEditButton, oldEditButton) {
        if (oldEditButton) {
            this.remove(oldEditButton);
        }

        if (newEditButton) {
            // add an event listeners for the `tap` event onto the new button, and tell it to call the onNameButtonTap method
            // when it happens
            newEditButton.on('tap', this.onEditButtonTap, this);

            this.add(newEditButton);
        }
    },

    onEditButtonTap: function(button, e) {
        var record = this.getRecord();

        Ext.Msg.alert(
            record.get('title'), // the title of the alert
            "Id of this item is: " + record.get('itemId') // the message of the alert
        );
    },

    applyMoveButton: function(config) {
        return Ext.factory(config, Ext.Button, this.getMoveButton());
    },

    updateMoveButton: function(newMoveButton, oldMoveButton) {
        if (oldMoveButton) {
            this.remove(oldMoveButton);
        }

        if (newMoveButton) {
            // add an event listeners for the `tap` event onto the new button, and tell it to call the onNameButtonTap method
            // when it happens
            newMoveButton.on('tap', this.onMoveButtonTap, this);

            this.add(newMoveButton);
        }
    },

    onMoveButtonTap: function(button, e) {
        var record = this.getRecord();

        Ext.Msg.alert(
            record.get('title'), // the title of the alert
            "Id of this item is: " + record.get('itemId') // the message of the alert
        );
    }
});

我正在调用details的中间部分被定义为具有vbox布局的自定义 View ,如下所示:
Ext.define('MyTabApp.view.CartListItemDetails', {
    extend  : 'Ext.Component',
    alias   : 'widget.cartlistitemdetails',
    config  : {
        cls     : 'x-details',
        flex    : 3,
        layout  : 'vbox',
        titleCell: null,
        qtyCell: null,
        items   : [{
            xtype   : 'panel',
            flex    : 1,
            itemId  : 'titleCell',
            html    : 'blahblah'
        },
        {
            xtype   : 'component',
            flex    : 1,
            itemId  : 'qtyCell',
            html    : 'blahblah'
        }],
    },
    setItemTitle    : function(title){
//      this.down('#titleCell').setHtml(title);
        console.log(this.getItems());
        this.getItems()[0].html = title;
    },
    setQuantity : function(qty){
//      this.down('#qtyCell').setHtml(qty);
        console.log(this.getItems());
        this.getItems()[0].html = qty;
    }
});

这是渲染具有图像,定价和水平对齐按钮的列表项。自定义组件的中间部分未呈现。如果我检查元素,它是如何生成html的:
<div class="x-details x-layout-box-item x-flexed x-stretched" id="ext-cartlistitemdetails-1" style="-webkit-box-flex: 3;"></div>

如您所见,此div内部没有任何内容,这就是它的呈现方式:

似乎我很接近,因为setItemTitle方法被调用了,但是this.down('#titleCell').setHtml(title)this.getItems()[0].html = title;仍然无法正常工作。

最佳答案

我也在尝试实现复杂的数据项布局。我正在hbox项目中使用vbox面板并能够实现它。

一探究竟
https://github.com/tomalex0/senchatouch-complex-dataitem

演示版
http://tomalex0.github.io/senchatouch-complex-dataitem/

尝试一下,让我知道它是否适合您。

07-26 06:41