如何在 Sencha touch 2.1 中创建复杂的数据项?

Posted

技术标签:

【中文标题】如何在 Sencha touch 2.1 中创建复杂的数据项?【英文标题】:How to create complex dataitem in Sencha touch 2.1? 【发布时间】:2013-03-08 12:49:15 【问题描述】:

我想在如下所示的列表中创建数据项:

但我无法使用 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 布局定义如下:

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; 不起作用。

【问题讨论】:

不确定,但为什么CartListItemDetails 中只有两个项目?另外,为什么titleCellpanelqtyCellcomponent?但实际上,为什么不将CartListItemDetails 制作成一个简单的panel,其中包含您使用 CSS 设置样式的 html 内容? 我也会使用 HTML 模板和 CSS 魔法来实现。然后,您将在列表中只有一个 itemtap 侦听器。在 itemtap 监听器调用的函数中,您可以找出点击事件的目标,从而触发任何其他函数。 @jakerella 实际上是因为沮丧,我添加/删除/更改了很多东西,因为有 2 项而不是 3 项,还有 panelcontainer @TDeBailleul 经过我所有的尝试,我打算去模板路线,但我仍然很想知道我做错了什么?在某些情况下,例如动态增加水平列表,其中模板的使用会扰乱 sencha 的计算,因此某些部分总是被隐藏,所以在我不能使用模板的情况下,我很想学习 dataitem 方法 【参考方案1】:

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

检查一下 https://github.com/tomalex0/senchatouch-complex-dataitem

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

试试看,如果它适合你,请告诉我。

【讨论】:

以上是关于如何在 Sencha touch 2.1 中创建复杂的数据项?的主要内容,如果未能解决你的问题,请参考以下文章

在 mac 上安装 sencha-touch 2.1

当“点击”列表项时在 Sencha Touch 中创建操作表

在 Sencha Touch 2 中创建 xtype ?

无法使用 Sencha Cmd 3.1.1.274 构建 Sencha Touch 2.1 应用程序

Sencha Touch 2:在选项卡面板中创建嵌套列表

在 Sencha Touch 中访问静态属性