JSONP无法处理ExtJS 4 - 未捕获的TypeError:无法调用未定义的方法'substring'

时间:2011-09-21 04:00:25

标签: extjs jsonp extjs4

我坚持使用这段代码,我从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'
        }
    }
});

提前致谢! 编

1 个答案:

答案 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
});