我想在如下所示的列表中创建数据项:
但我无法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;
不起作用。