Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSONP不在ExtJS4上工作-未捕获类型错误:无法调用方法';子串';未定义的_Extjs_Jsonp_Extjs4 - Fatal编程技术网

JSONP不在ExtJS4上工作-未捕获类型错误:无法调用方法';子串';未定义的

JSONP不在ExtJS4上工作-未捕获类型错误:无法调用方法';子串';未定义的,extjs,jsonp,extjs4,Extjs,Jsonp,Extjs4,我被这段代码困住了,我从Youtube API获取json格式的数据,如果我使用类型:'json',它将失败,因为跨域的事情,但其他元素无论如何都会加载;然后,如果我将type:更改为'jsonp'(这是extjsapi上描述的语法),它会给我这个错误:“未捕获的TypeError:无法调用未定义的方法'substring'”我尝试设置type:'anyotherstupidthing',同样的情况也会发生,那么会发生什么呢 以下是我当前的数据模型和我的存储: Ext.define('Video

我被这段代码困住了,我从Youtube API获取json格式的数据,如果我使用类型:'json',它将失败,因为跨域的事情,但其他元素无论如何都会加载;然后,如果我将type:更改为'jsonp'(这是extjsapi上描述的语法),它会给我这个错误:“未捕获的TypeError:无法调用未定义的方法'substring'”我尝试设置type:'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'
        }
    }
});
提前谢谢!
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。该类还生成参数值,以避免名称与并行/后续请求冲突。