2011-04-27 85 views
2

我将以通常的免责声明开始:新的Sencha Touch /使用JSON,在黑暗中徘徊。任何帮助或刺激正确的方向比你知道的更赞赏!访问JSON订阅源中的嵌套对象 - Sencha Touch

我试图让我的应用程序从公开的Google Spreadsheet JSON提要中获取数据。从我设法弄清楚,我目前的模型是基于JSON数组,而不是嵌套对象。我如何访问并返回嵌套对象?

Ext.regModel('Count', { 
    fields: [{name:'$t'}] 

}); 

this.list = new Ext.List({ 
      itemTpl: new Ext.XTemplate('<div>{$t}</div>'), 
      loadingText: false, 
      store: new Ext.data.Store({ 
       model: 'Count', 
       proxy: { 
        type: 'scripttag', 
        url : 'http://spreadsheets.google.com/feeds/cells/0AuYDRk91MX8-dHhkV29ZVkRGNjlvZjV4QVBIVmJubVE/odb/public/basic?range=A1&alt=json', 
        reader: { 
         type: 'json', 
         root: 'feed' 
        } 
       } 
      }) 
     }); 

的JSON数据(多余的东西去掉,上面的链接将显示所有的它,如果需要的话,包含电子邮件地址,我宁愿不发布,并已编入索引):

{ 
    "feed":{ 
     "entry":[{ 
      "content":{ 
       "type":"text", 
       "$t":"11" 
      } 
     }] 
    } 
} 

如果我在使用数组的另一个JSON提要中使用plop,我可以使用它很好,但只是无法弄清楚我需要做什么来访问对应于$ t的对象中的整数。如果我将“入口”作为根而不是“feed”,则会出现一个错误消息:“Uncaught TypeError:无法读取未定义的属性'长度'。”

+0

尝试类似:'根:“feed.entry'' - 应该让你一步一步地接近你想要什么。 – nelstrom 2011-04-27 07:01:41

+0

@nelstrom谢谢!这让我略微接近。现在,我的列表生成一个列表项(这很有道理,JSON提要只能得到一个结果),但我仍然无法访问$ t对象内容。我更新的regModel如下:'Ext.regModel('Count',{{name:'$ t',mapping:'content。$ t'}] });' – Kate 2011-04-27 16:25:26

+0

@nelstrom其实,我有它工作!事实证明,列表项模板不像$ {t}变量中的美元符号。一旦我将它和模型切换到任意名称的映射,它就开始工作了! 'Ext.regModel('Count',{fields:[{name:'count',mapping:'content。$ t'}]});' – Kate 2011-04-27 16:36:42

回答

4

解决方案!原来Sencha不喜欢我的模板变量中的$。

Ext.regModel('Count', { 
    fields: [{name:'count', mapping:'content.$t'}] 

}); 

this.list = new Ext.List({ 
      itemTpl: new Ext.XTemplate('<div>{count}</div>'), 
      loadingText: false, 
      store: new Ext.data.Store({ 
       model: 'Count', 
       proxy: { 
        type: 'scripttag', 
        url : 'http://spreadsheets.google.com/feeds/cells/0AuYDRk91MX8-dHhkV29ZVkRGNjlvZjV4QVBIVmJubVE/odb/public/basic?range=A1&alt=json', 
        reader: { 
         type: 'json', 
         root: 'feed.entry' 
        } 
       } 
      }) 
     });