1

我正在使用 sencha 架构师编写一个 sencha 触摸应用程序。因为我的应用程序做了很多 ajax 请求,所以大部分都需要在请求标头中发送“令牌”以进行身份​​验证。所以我想创建基于 Ext.Ajax 的子类,它在请求头中总是有“令牌”。然后我可以使用这个子类而不用关心标题。

MyApp.override.Ajax.request({ ... })

我尝试在 app/override/Ajax.js 中定义它

Ext.define('Myapp.override.Ajax', {
  override: 'Ext.Ajax',
  headers: {
      'token': 'test'
  }
});

我还在应用程序中将此设置为“要求”。但是尝试调用时会出错

Myapp.override.Ajax.request({ ... })

似乎 Myapp 找不到 .override 包(MyApp.override 未定义)

如何让 MyApp 知道覆盖包或执行此操作的正确/最佳方法是什么。

一个简单的例子非常感谢。非常感谢。

更新信息:

覆盖文件位置:app\override\Ajax.js

.html 文件:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
    var Ext = Ext || {};
    Ext.theme = {
        name: "Default"
    };
</script>
<script src="sencha-touch-all-debug.js"></script>
<link rel="stylesheet" href="resources/css/sencha-touch.css">
<script src="app/override/Ajax.js"></script>
<script type="text/javascript" src="app.js"></script>
</head>
<body></body>
</html>

app.js 文件

Ext.Loader.setConfig({

});

Ext.application({

requires: [
    'MyApp.override.Ajax'
],
views: [
    'ContactDetailView'
],
name: 'MyApp'
...

应用程序可以正常启动,但调用 MyApp.override.Ajax.request 时:无法读取 undefined 的属性“Ajax”,意味着 MyApp.override 未定义

更新

这里有一些新闻,它更好但还没有工作。

Ext.define('MyApp.Ajax', {
extend: 'Ext.data.Connection',
singleton: true,

request: function( options ) {
    this.constructor(options, options.url);
console.log(options);
    options.header = {'Token':'mytoken'};
    this.callParent( options );
}
});

尝试 MyApp.Ajax.request() 时出错。我确定 options.url 通过检查日志存在于选项中

[ERROR][Ext.data.Connection#request] No URL specified 

我从构造函数添加扩展

constructor : function (config, url)
{
    config = config || {};
//config.url = 'google.com';
    this.initConfig(config);
    this.callParent(config);
},

当我从 config.url = 'google.com' 中删除评论时,错误就消失了;但它的 config.url 有 ajax 请求 url 但本地文件 url ??? 我从 chrome 控制台和网络中看到?

GET file:///C:/MyApp/assets/www/google.com?_dc=1370855149720  

请帮忙。谢谢。

4

3 回答 3

2

最后,这是和我一起工作

Ext.define('MyApp.Ajax', {    
    extend: 'Ext.data.Connection',

    singleton: true,

    request: function( options ) {
        options.headers = {
            Token: 'mytoken',
        };
        this.callParent( [options] );
    }
});

这个简单的做我想做的事,太棒了。

Ext.Ajax.on('beforerequest', (function(conn, options, eOpts) {  
    options.headers = {
        Token: 'mytoken',
    };
}), this);
于 2013-06-16T18:10:18.133 回答
1

对于覆盖类的名称,您似乎不同意自己的看法:

  • Myapp.override.Ajax
  • Lunex.override.Ajax
  • Myapp.override.data.proxy.Ajax

哪一个?注意这一点,Loader 不会轻易搞定的……

override无论如何,您似乎对and有点困惑extend

extend确实从父类创建了一个新类,并带有您指定的修改。然后您可以使用您定义的类,就像您尝试做的那样。

override,另一方面,将修改应用于现有类。在这种情况下,类名仅用于 require 语句,并且由加载器使用。没有创建实际的类。因此,在您的示例中,MyApp.override未定义命名空间,因此出现错误。不过,无论何时使用Ext.Ajax,都应该发送您的自定义标头。前提是您是加载文件的经理,即 ;p

现在,您的情况有点特殊,因为Ext.Ajax是. 查看它的代码,那里没有太多内容。虽然覆盖单例是有意义的,但从它扩展会令人不安。Ext.data.Connection

所以,你可能想要做的是:

Ext.define('Myapp.Ajax', {
    extend: 'Ext.data.Connection',
    headers: {
        'token': 'test'
    }
});

这样你就可以做到:

Myapp.Ajax.request({ ... });

这里的最佳选择是覆盖还是扩展是一个棘手的问题。我很高兴你没有问!

于 2013-06-08T02:11:14.567 回答
0

为什么不在扩展类中使用配置“defaultHeaders”?这样,它总是添加到您的标题中。

http://docs-origin.sencha.com/touch/2.4.0/apidocs/#!/api/Ext.data.Connection-cfg-defaultHeaders

来自 Ext.data.Connection 的来源

setupHeaders: function(xhr, options, data, params) {
    var me = this,
        headers = Ext.apply({}, options.headers || {}, me.getDefaultHeaders() || {}),
        contentType = me.getDefaultPostHeader(),
        jsonData = options.jsonData,
        xmlData = options.xmlData,
        key,
        header;
于 2014-10-23T18:34:18.767 回答