我坚持使用这段代码,我从Youtube API获取这个json格式的数据,如果我使用type:'json'它会失败,因为那个跨域的东西,但其他元素仍然加载;然后,如果我将类型改为:'jsonp'(这是ExtJS API中描述的语法),它会给我这个错误:“未捕获TypeError:无法调用未定义的方法'substring'”我试过设置类型:'anyotherstupidthing'同样的事情发生了,那么可能会发生什么?
以下是我当前的数据模型和我的商店:
Ext.define('Video', {
extend: 'Ext.data.Model',
fields: ['id', 'title']
});
myStore2 = Ext.create('Ext.data.Store', {
model: 'Video',
proxy: {
type: 'ajax',
url : 'http://gdata.youtube.com/feeds/api/videos?q=surfing&v=2&alt=jsonc',
reader: {
type: 'jsonp',
root: 'items'
}
}
});
提前致谢! 编
答案 0 :(得分:3)
JsonP要求服务器将返回的数据包装在JS函数调用中。常见的合同是将一个名为'callback'的参数传递给服务器,以允许唯一的名称,并避免客户端上的名称冲突。
在浏览器中调用网址http://gdata.youtube.com/feeds/api/videos?q=surfing&v=2&alt=jsonc&callback=myCallback
表明YouTube支持此约定:
Ext通过Ext.data.proxy.JsonP代理类支持JsonP。阅读器是标准的JSON阅读器,不特定于JsonP,您只需要考虑从服务器返回的数据结构(将root
设置为data.items
)。
工作代码如下所示:
var myStore2 = Ext.create('Ext.data.Store', {
model: 'Video',
proxy: {
type: 'jsonp',
url : 'http://gdata.youtube.com/feeds/api/videos?q=surfing&v=2&alt=jsonc',
reader: {
type: 'json',
root: 'data.items'
}
},
listeners: {
load: function(store, records) {
Ext.each(records, function(rec) {
console.log(rec.get('title'));
});
}
},
autoLoad: true
});