2013-03-08 10 views
5

Ich mag Dataitem in einer Liste erstellen, die wie folgt aussieht: Required layoutWie erstellt man komplexe Daten in Sencha touch 2.1?

aber ich bin nicht in der Lage Mitte vbox Abschnitt mit 3 Komponenten zu machen. Ich verfolge dieses Beispiel: http://www.sencha.com/blog/dive-into-dataview-with-sencha-touch-2-beta-2/

Dies ist, wie ich meine Daten Artikel bin definieren:

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 das Mittelteil, die ich details nenne ist definiert als benutzerdefinierte Ansicht mit vbox Layout ist wie folgt definiert Dies wird Rendering Listenelemente mit Bild, Preis & horizontal ausgerichtete Tasten

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

:. Der mittlere Abschnitt, der eine benutzerdefinierte Komponente ist, wird nicht gerendert. Wenn ich Element inspizieren ist es wie HTML generiert:

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

wie können Sie sehen, es gibt nichts in diesem div ist und das ist, wie es gemacht wird:

Actual list items

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

+1

Nicht sicher bei allem, aber warum gibt es nur zwei Elemente in 'CartListItemDetails'? Außerdem, warum ist 'titleCell' ein' panel' und '' qtyCell' '' component''? Aber warum sollte man CartListItemDetails nicht einfach zu einem "Panel" mit HTML-Inhalten machen, die man mit CSS formatiert? – jakerella

+0

würde ich es auch mit einer HTML-Vorlage machen und so CSS-magisch machen. Dann hätten Sie nur einen ItemTap-Listener in der Liste. In der Funktion, die der ItemTap-Listener aufruft, können Sie das Ziel des Tap-Events herausfinden und somit jede andere Funktion auslösen. –

+0

@jakerella eigentlich wegen der Frustration Ich habe hinzugefügt/entfernt/geändert viele Dinge, wegen denen es 2 Elemente anstelle von 3 und auch das "Panel" & "Container". – ThinkFloyd

Antwort