JSONP 不适用于 ExtJS 4 - 未捕获的类型错误:无法调用未定义的方法“子字符串”

Posted

技术标签:

【中文标题】JSONP 不适用于 ExtJS 4 - 未捕获的类型错误:无法调用未定义的方法“子字符串”【英文标题】:JSONP not working on ExtJS 4 - Uncaught TypeError: Cannot call method 'substring' of undefined 【发布时间】:2011-11-21 14:35:03 【问题描述】:

我被这段代码卡住了,我从 Youtube API 获取这个 json 格式的数据,如果我使用 type:'json' 它将失败,因为跨域的事情,但其他元素无论如何都会加载;然后,如果我将 type: 更改为 'jsonp' (这是 ExtJS API 上描述的语法),它会给我这个错误:“Uncaught TypeError: Cannot call method 'substring' of undefined” 我尝试设置 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'
        
    
);

提前致谢! 编。

【问题讨论】:

【参考方案1】:

JsonP 要求服务器将返回的数据包装在一个 JS 函数调用中。常见的约定是向服务器传递一个名为“回调”的参数,以允许使用唯一名称并避免客户端上的名称冲突。

在浏览器中调用 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,因此您必须将proxy.callbackKey 设置为“myCallback”。 你尝试运行代码了吗?这是经过测试的代码。我确实运行它并且它确实工作(Ext 4.0.2a)。回调参数由 Ext.data.proxy.JsonP 类添加到代理 url。该类还生成参数值以避免与并行/后续请求的名称冲突。

以上是关于JSONP 不适用于 ExtJS 4 - 未捕获的类型错误:无法调用未定义的方法“子字符串”的主要内容,如果未能解决你的问题,请参考以下文章

“未捕获的语法错误:意外的令牌:”与 $http.jsonp

Jquery ui 1.8.10 范围滑块不适用于 jquery 3.4.1

如何使用httpclient拦截角度jsonp请求

jQuery JSONP“未捕获的语法错误:意外的令牌:”

jsonp 请求中的“未捕获的类型错误:无法读取未定义的属性‘toLowerCase’”

获取未捕获的语法错误:意外的令牌:读取 jsonp 响应时