JSONP不在ExtJS4上工作-未捕获类型错误:无法调用方法';子串';未定义的
我被这段代码困住了,我从Youtube API获取json格式的数据,如果我使用类型:'json',它将失败,因为跨域的事情,但其他元素无论如何都会加载;然后,如果我将type:更改为'jsonp'(这是extjsapi上描述的语法),它会给我这个错误:“未捕获的TypeError:无法调用未定义的方法'substring'”我尝试设置type:'anyotherstupidthing',同样的情况也会发生,那么会发生什么呢 以下是我当前的数据模型和我的存储:JSONP不在ExtJS4上工作-未捕获类型错误:无法调用方法';子串';未定义的,extjs,jsonp,extjs4,Extjs,Jsonp,Extjs4,我被这段代码困住了,我从Youtube API获取json格式的数据,如果我使用类型:'json',它将失败,因为跨域的事情,但其他元素无论如何都会加载;然后,如果我将type:更改为'jsonp'(这是extjsapi上描述的语法),它会给我这个错误:“未捕获的TypeError:无法调用未定义的方法'substring'”我尝试设置type:'anyotherstupidthing',同样的情况也会发生,那么会发生什么呢 以下是我当前的数据模型和我的存储: Ext.define('Video
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'
}
}
});
提前谢谢!
JsonP要求服务器将返回的数据包装在JS函数调用中。常见的约定是向服务器传递一个名为“callback”的参数,以允许使用唯一的名称,并避免客户端上的名称冲突 调用URL
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
});
代码肯定不起作用。代理的url显示在浏览器json中,而不是jsonp中。因此,您必须添加到url
&callback=myCallback
,正如您在代码前面正确提到的那样。但这还不是全部。由于您使用的是&callback=myCallback
而不是默认的&callback=callback
,因此必须设置为“myCallback”。是否尝试运行代码?这是经过测试的代码。我确实运行了它,它确实工作(ext4.0.2a)。回调参数由Ext.data.proxy.JsonP类添加到代理url。该类还生成参数值,以避免名称与并行/后续请求冲突。