0

我有以下 json 数据。

{
"pendingTasksVOs" : [{
        "groupName" : "LAST_MONTH",
        "documents" : [{
                "description" : "kvk1",
                "uploadDate" : "1-12-2012"
            }
        ]
    }, {
        "groupName" : "OLDER",
        "documents" : [{
                "description" : "kvk2",
                "uploadDate" : "1-11-2012"
            }, {
                "description" : "kvk3",
                "uploadDate" : "1-10-2012"
            }, {
                "description" : "kvk4",
                "uploadDate" : "1-01-2012"
            }
        ]
    }
]
}

我想在按 GroupName 分组的 Sencha Touch 列表中显示它。

我希望列表采用以下格式:

组名:Group1
-----------------------------------------
Description11 , UploadDate11 这应该是单独的可点击列表行
-----------------------------------------
Description12 , UploadDate12 这应该是单独的可点击列表行
-----------------------------------------
Description13 , UploadDate13 这应该是单独的可点击列表行
-----------------------------------------
******************************
组名:Group2
-----------------------------------------
Description21 , UploadDate21 这应该是单独的可点击列表行
-----------------------------------------
Description22 , UploadDate22 这应该是单独的可点击列表行
-----------------------------------------
******************************

我正在尝试使用 Sencha Touch List 组件。但我不会按照上述要求获得清单

//This is my store 
var store = Ext.create('Ext.data.Store', {
        model: 'Demo.model.DocumentList',
        rootProperty: 'pendingTasksVOs',                                          
        autoLoad: true,                                                                             
        grouper: {
        groupFn: function(record) {
            if (record && record.data.title) {
                    return record.get('groupName');
                } else {
                return '';
                }
            }
        }           
    });

//template for list item
var listTemplate = new Ext.XTemplate(                                           
        '<tpl for=".">',
        '{groupName}</br>',
        '<ul>',
        '<tpl for="documents">',
        '{description}  {uploadDate} </br>',
        '</tpl>',
        '</ul>',
        '</tpl>'                                            
        );


// Initialize the main view
Ext.getCmp("pendingTasksListId").add(Ext.create('Ext.List', {
  fullscreen: true,
  itemTpl:  listTemplate,     
  store: store,
  groupField:'description',
  grouped: true
}));

//DocumentListModel is defined under /app/model/ 
Ext.define('Demo.model.DocumentList', {
extend: 'Ext.data.Model',
requires : ['Demo.model.Doc'],
config: {
     fields: ['groupName', 'documents'],
     hasMany : {

        model : "Demo.model.Doc", 
        associationKey: 'documents'
    },
    proxy: {
        type: 'rest',
        url : "/getPendingTasks",
        reader: {
            type: 'json',           
            rootProperty : 'pendingTasksVOs'
        }
    }       
}
}

//Document Model is defined under /app/model/ 
Ext.define('Demo.model.Doc', {
extend: 'Ext.data.Model',    
config: {
     fields: ['description', 'uploadDate'],
     belongsTo: "Demo.model.DocumentList"
}   
}); 
});

我能够得到如下列表项:

组的名字,
说明11,上传日期11
说明12,上传日期12

但以上全部内容是可点击的。我希望每个 Description 和 UploadDate 对都是可点击的。

谁能指导我如何实现上述要求?

4

2 回答 2

1

我得到了我的问题的解决方案。

在 /app/reader/ 文件夹下创建以下自定义 json 阅读器作为 CustomReader.js

Ext.define('Demo.reader.CustomReader', {
extend: 'Ext.data.reader.Json',
alias: 'reader.customReader',
getData: function(data) {       // overriding
    data = this.callParent(arguments);
    var responseString = Ext.encode(data);
    var json = JSON.parse(responseString);
    var result = [];
    Ext.each(json.pendingTasksVOs, function(entry) {

        var groupName = entry.groupName;
        Ext.each(entry.documents || [], function(document) {          
            result.push({
                description : document.description,
                uploadDate: document.uploadDate,
                groupName: groupName
            });
        });
    });
    return result;
}
});

Doc 模型应在 /app/model 中创建,如下所示为 Doc.js

Ext.define('Demo.model.Doc', {
extend: 'Ext.data.Model',    
config: {
     fields: ['description','uploadDate','groupName']       
}
});

Store 可以在 /app/store 文件夹中创建 Store 应该使用这个自定义阅读器,如下所示:

Ext.define("Demo.store.DocumentStore", {
extend:'Ext.data.Store',
requires:['Demo.model.Doc' , 'Ext.data.proxy.Rest', 'Demo.reader.CustomReader'],
id:'DocumentStore1',
config:{
    model:'Demo.model.Doc',
    autoLoad:true,
    grouper:{
        groupFn:function (record) {
            if (record && record.data.groupName) {
                return record.get('groupName');
            } else {
                return '';
            }
        }
    },
    proxy:{
        type:'rest',
        url:"/getPendingTasks",
        reader:{
            type:'customReader'     //This is our custom reader         
        }
    }
}
});

//最后可以如下创建列表

Ext.create('Demo.store.DocumentStore');
// Initialize the main view
Ext.getCmp("pendingTasksListId").add(Ext.create('Ext.List', {
fullscreen:true,
itemTpl:'<div class="contact">{description} {uploadDate} {groupName}  </div>',
store: 'DocumentStore1',
grouped:true
}));    

上面给了我一个列表,我从接收到的有问题的 json 中为每个 {description} {uploadDate} 对获取单独的行

于 2012-12-04T14:14:18.637 回答
0

试试这个,

itemTpl: [
'<div>GroupName : {groupName}</div>',
'<div>',
'<ul>',
'<tpl for="documents">',
'<li>{description} , {uploadDate}</li>',
'</tpl>',
'</ul>',
'</div>',
].join('')

或这个,

itemTpl: [
'<div>GroupName : {groupName}</div>',
'<div>',
'<ul>',
'<tpl for="documents">',
'<li><div onclick="whateverYouWantToDo()">{description} , {uploadDate}</div></li>',
'</tpl>',
'</ul>',
'</div>',
].join('')
于 2012-12-04T06:31:44.350 回答