次のようなリストにデータ項目を作成したい:
vbox
しかし、3 つのコンポーネントで中間セクションをレンダリングできません。私はこの例に従っています: 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;
。