我有一个返回7个值的函数,我使用一个元组来返回它们,因为它们没有相同的类型 那我就把它分开了 所以我可以在我的js脚本中读取我生成的json,我可以通过ItemN
访问它看看代码:
public JArray getJsonData( )
{
//my queries here//
var vl = new List<Tuple<string, string, string, int, int, double, string >>();
vl.Add(new Tuple<string, string, string,int, int, double, string>
(item.Date , item.Adress, name, item.login, pwd, role, id));
}
JArray o = JArray.FromObject(vl);
return o;
}
我的extjs4商店:
var myStore2 = new Ext.data.JsonStore({
fields: ['Item1', 'Item2', 'Item3', 'Item4', 'Item5', 'Item6', 'Item7'] ,
data: []
});
问题是现在我需要返回另一个元素,使它们在我的元组中成为8个元素 所以我得到了这个有趣的错误
the eight element of an eight tuple must be a tuple
所以我将我的八个元素添加为请求的元组。
问题是现在我得到了这种json格式:(注意结尾的'Rest')
{Item1:"27-09-2011",Item2:"LA",Item3:"armance",Item4:"astrocybernaute",Item5:"P@ssw0rd",Item6:"Admin",Item7,Rest : {Item1 : 26 }}
问题是我不知道如何在我的extjs4商店中访问它。 Item8当然不起作用,Rest不起作用,item1也没有!!
任何想法PLZ?
谢谢你的时间
编辑这是Matt Greer建议后的新店
Ext.define('MyModel', {
extends: 'Ext.data.Model',
fields: [
{ name: 'Item1' },
{ name: 'Item2' },
{ name: 'Item3' },
{ name: 'Item4' },
{ name: 'Item5' },
{ name: 'Item6' },
{ name: 'Item7' },
{ name: 'Item8', mapping: 'Rest.Item1' }
]
});
var myStore2 = new Ext.data.JsonStore({
model: 'MyModel',
proxy: {
type: 'ajax',
url: '',
autoLoad :true,
reader: {
type: 'json'
}
}
});
但它仍无效
解 我想指出Store.loadData不尊重字段映射
问题在于,sencha团队改变了loadData的行为,并且它不是以明确的方式记录的内容。
将以下内容添加到您的代码库中(在应用代码上方,但在ext-all.js下方):
Ext.override(Ext.data.Store, {
loadDataViaReader : function(data, append) {
var me = this,
result = me.proxy.reader.read(data),
records = result.records;
me.loadRecords(records, { addRecords: append });
me.fireEvent('load', me, result.records, true);
}
});
然后使用:
mystore2.loadDataViaReader(data)
答案 0 :(得分:1)
我不确定Tuple错误来自哪里。 .NET支持octuples,如here
所示试一试
var myTuple = Tuple.Create(3,4,5,8,12,4,12,99);
myTuple应该是8个整数的八元组。
但是,如果您仍然遇到该错误并且必须在Ext中解决它,则可以使用映射。您需要定义一个Model,并在Model的字段中使用映射来获取最后一个值:
Ext.define('MyModel', {
extends: 'Ext.data.Model',
fields: [
{ name: 'field1' },
// fields 2 through 7
{ name: 'field8', mapping: 'Rest.Item1' }
]
});
var myStore = new Ext.data.JsonStore({
model: 'MyModel',
// ...
});
我从未真正尝试过在商店中定义字段,我认为Ext会自动为您创建一个模型。所以你也可以在商店中进行映射。
答案 1 :(得分:1)
当我们使用loadData方法以及使用的代理是Memory
代理时,您的解决方案就会运行。
事实上,似乎 EXTJS在内存代理时无法映射数据。但是当它的Ajaxs代理时,它可以映射数据和字段。
使用内存代理实例
var fields = [
{name: 'id', mapping: 'id'},
{name: 'code', mapping: 'code'},
{name: 'code', mapping: 'exercice'},
{name: 'code', mapping: 'code'},
{name: 'typeDocument', mapping: 'typeDocument'},
{name: 'utilisateur', mapping: 'editionJobs[0].utilisateur'},
{name: 'dateCreation', mapping: 'editionJobs[0].dateCreation'},
{name: 'jobId', mapping: 'editionJobs[0].id'},
{name: 'avenant', mapping: 'editionJobs[0].avenant'},
{name: 'etat', mapping: 'editionJobs[0].etat'}
];
var data = [];
store = new Ext.data.Store({
fields: fields,
proxy: {
type: 'memory',
reader: {
type: 'json',
root: 'listDossier'
}
},
listeners: {
load: function(store, records, options) {
store.fireEvent('datachanged', store);
}
}
});
Ext.getCmp('listeEditionDossierGridPanel').getStore().loadDataViaReader(listDossier); // OK, thx for the method ;)
Ext.getCmp('listeEditionDossierGridPanel').getStore().loadData(listDossier); // Not ok
Ajax Proxy的其他例子:
var fields = [
{name: 'code', mapping : 'code'},
{name: 'avis', mapping : 'demande.avis'},
{name: 'commentaire', mapping : 'demande.commentaire'},
{name: 'id', mapping: 'demande.id'}
];
store = new Ext.data.Store({
fields: fields,
autoLoad: true,
proxy: {
type: 'ajax',
extraParams: {jsonRequest:JSON.stringify(valeurs)},
url : 'chargerDossiersEligibles.do',
reader: {
type: 'json',
root: 'dossiersEligibles'
}
}
});
在这种情况下,一切都很好,数据可以映射。
干杯
贝努瓦