如何显示嵌套的json数据/ extjs4?

问题描述:

我有一个返回7值的函数,我用一个元组返回它们,因为它们没有相同的类型 然后我serelizes它 所以我可以在我的js脚本中读取我的结果json,我可以通过ItemN如何显示嵌套的json数据/ extjs4?

看看代码:

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 ELE在我的元组 发言:所以我得到这个有趣的错误

the eight element of an eight tuple must be a tuple 

,所以我加我8元的元组的要求。

的问题是,现在我得到这个JSON格式:(注意“休息”末)

{Item1:"27-09-2011",Item2:"LA",Item3:"armance",Item4:"astrocybernaute",Item5:"[email protected]",Item6:"Admin",Item7,Rest : {Item1 : 26 }} 

问题是,我不知道如何访问它在我的店里extjs4。 Item8当然不起作用,Rest不起作用,item1也不起作用!

任何想法plz?

感谢您对乌尔时间

编辑这是我的马特·格里尔建议

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

后新店,但它仍然没有工作

SOLUTION 我想指出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

不直接关系到你的问题,但也许你应该看看Dextop,因为它解决了许多.NET/Ext JS的数据连接问题。 https://github.com/codaxy/dextop – Marko

+0

msdn说:“.NET框架直接支持具有一至七个元素的元组,另外,可以通过将元组对象嵌套在Rest属性中来创建八个或更多元素的元组(T1,T2,T3,T4,T5,T6,T7,TRest)对象的元组。来源:http://msdn.microsoft.com/en-us/library/system.tuple.aspx – mistaecko

+0

是啊我得到这个,问题是我做了这个我不知道如何读嵌套的JSON数据到我的extjs网格 – Armance

我不知道是哪里元组错误来自于。如图所示here

试试这个

var myTuple = Tuple.Create(3,4,5,8,12,4,12,99); 

myTuple应该是8个INTS的八倍octuples被.NET支持。

但是,如果您仍然遇到该错误,并且您必须在Ext中解决此问题,则可以使用映射。您需要定义一个模型,并在模型的字段使用的映射来抓住这最后一个值:

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会自动创建模型您。所以你可能也可以在商店中进行映射。

+0

感谢你的回复,警告你我仍然对.net和extjs都很陌生。支持八进制,但八项应该是一个元组(TRest),看看你的链接,它的存在。但img会再次测试以确保。 – Armance

+0

我也会尝试你的第二个建议,但我从来不明白模型是如何工作的。 – Armance

+0

啊,是的,你是对的。这是一个有趣的限制。在这种情况下,听起来你需要使用Ext来解决这个问题。我上面的例子应该工作。首先,我会尝试在商店中将“映射”属性添加到您的第八个字段。如果这是不行的话,只需定义一个如上所述的模型并告诉商店使用它。 –

当我们使用loadData方法,以及使用的代理是Memory代理时,您的解决方案会运行。

其实,看来EXTJS不能映射数据时,它的内存代理。但是当它的一个Ajaxs代理它可以映射数据和字段

Exemples内存代理

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代理:

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

在这种情况下,所有的罚款和DATAS可以映射。

干杯

伯努瓦