Frage Wie erstellt man komplexe Daten in Sencha touch 2.1?


Ich möchte Datenelement in einer Liste erstellen, die wie folgt aussieht: Required layout

aber ich bin nicht in der Lage, die Mitte darzustellen vbox Abschnitt mit 3 Komponenten. Ich folge diesem Beispiel: http://www.sencha.com/blog/dive-into-dataview-with-sencha-touch-2-beta-2/

So definiere ich mein Datenelement:

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

Und der mittlere Abschnitt, den ich anrufe details ist definiert als benutzerdefinierte Ansicht mit vbox Layout ist wie folgt definiert:

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

Dies ist das Rendern von Listenelementen mit Bild-, Preis- und horizontal ausgerichteten Schaltflächen. Der mittlere Abschnitt, der eine benutzerdefinierte Komponente ist, wird nicht gerendert. Wenn ich Element überprüfe, ist es wie HTML generiert wird:

<div class="x-details x-layout-box-item x-flexed x-stretched" id="ext-cartlistitemdetails-1" style="-webkit-box-flex: 3;"></div>

Wie du sehen kannst, gibt es nichts in diesem div und so wird es gerendert:

Actual list items

Es scheint, ich bin nah dran, weil setItemTitle Methode wird aber immer noch aufgerufen this.down('#titleCell').setHtml(title) oder this.getItems()[0].html = title; funktioniert nicht.


5
2018-03-08 12:49


Ursprung


Antworten:


Ich habe auch versucht, ein komplexes Datenelement-Layout zu implementieren. Ich verwende vbox-Panel innerhalb von hbox-Elementen und kann es implementieren.

Hör zu https://github.com/tomalex0/senchatouch-complex-dataitem

Demo http://tomalex0.github.io/senchatouch-complex-dataitem/

Probieren Sie es aus und lassen Sie mich wissen, ob es für Sie funktioniert.


6
2017-07-29 08:19